write(fd1, "!", 1);什么意思
时间: 2024-05-20 14:13:44 浏览: 16
这行代码是在Linux系统下使用文件描述符(fd1)向文件写入一个字节的数据"!"。其中,write是Linux系统下的一个系统调用函数,用于向文件写入数据。第一个参数(fd1)是文件描述符,即指向已打开文件的指针;第二个参数"!"是要写入的数据的指针;第三个参数1表示要写入的数据的大小,即一个字节。因此,这行代码的意思是向文件写入一个"!"字符。
相关问题
#include<unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argec,char *argv[]){ int fd1[2],fd2[2]; pipe(fd1); pipe(fd2); int pid1=fork(); int pid2=fork(); if(pid1>0){ close(fd1[1]); close(fd2[1]); char str1[25]; char str2[25]; read(fd1[0],str1,25); printf("child1 say:%s\n",str1); read(fd2[0],str2,25); printf("child2 say:%s\n",str2); } if(pid1==0){ close(fd1[0]); char str1[30]; write(fd1[1],"hello father i am child1!",30); } if(pid2==0){ close(fd2[0]); char str2[30]; write(fd2[1],"hello father i am child2!",30); } return 0; }为什么这个代码运行后printf语句运行了四次
这个代码运行后,printf语句运行了四次是因为有两个fork语句,导致产生了两个子进程。在第一个fork语句之后,父进程产生了一个子进程pid1,然后子进程pid1又产生了一个子进程pid2。因此最终会有三个进程在运行,分别是父进程、子进程pid1和子进程pid2。
在父进程中,有两个子进程向管道fd1和fd2中写入了数据("hello father i am child1!"和"hello father i am child2!"),父进程在读取管道fd1和fd2中的数据时,会分别读取两个子进程写入的数据,因此printf语句会运行两次,分别输出"child1 say:hello father i am child1!"和"child2 say:hello father i am child2!"。
在子进程pid1和pid2中,各自向管道fd1和fd2中写入了数据,但是并没有读取管道中的数据,因此并没有产生输出。
对以下简单的 TCP 服务器程序,1)做出其函数调用关系图 2)写出表达其系统函数调用序列的上下文无关语法的产生式系统。 int fd1, fd; fd=socket(AF_INET, SOCK_STREAM, 0); bind(fd, …); listen(fd,…); while(1){ fd1=accept(fd, ….); read(fd1, buff, size); /*解析客户请求并响应*/ ret = request_proc(buff,size,…); if(ret>=0){ /*ret<0 表示有错误, 例如非法请求*/ write(fd1,…); } close(fd1); }
1) 函数调用关系图如下:
```
+----------------+
| accept |
+----------------+
|
|
+----------------+
| read |
+----------------+
|
|
+----------------+
| request_proc |
+----------------+
|
|
+-------------------+ +-------v-------+
| | | |
| main +-------> close |
| | | |
+-------------------+ +---------------+
|
|
+-------------------+
| |
| socket |
| |
+-------------------+
|
|
+-------------------+
| |
| bind |
| |
+-------------------+
|
|
+-------------------+
| |
| listen |
| |
+-------------------+
```
2) 表达其系统函数调用序列的上下文无关语法的产生式系统如下:
```
<server-program> ::= <socket-func> <bind-func> <listen-func> <accept-loop>
<accept-loop> ::= while (1) { <accept-func> <read-func> <request-proc> <write-func> <close-func> }
<socket-func> ::= socket(AF_INET, SOCK_STREAM, 0);
<bind-func> ::= bind(<socket-fd>, ...);
<listen-func> ::= listen(<socket-fd>, ...);
<accept-func> ::= fd1=accept(<socket-fd>, ...);
<read-func> ::= read(<fd1>, <buff>, <size>);
<request-proc> ::= ret = request_proc(<buff>, <size>, ...);
<write-func> ::= write(<fd1>, ...);
<close-func> ::= close(<fd1>);
```
其中,`<socket-fd>` 表示调用 `socket` 函数返回的套接字文件描述符,`<fd1>` 表示调用 `accept` 函数返回的客户端文件描述符, `<buff>` 表示读取的数据缓冲区,`<size>` 表示读取的数据长度,`<ret>` 表示请求处理函数的返回值。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)