管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
1
2 |
#include <unistd.h> int pipe( int
fd[2]) |
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
从管道中读取数据:
关于管道的读规则验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 |
/************** * readtest.c * **************/ #include <unistd.h> #include <sys/types.h> #include <errno.h> main() { int
pipe_fd[2]; pid_t pid; char
r_buf[100]; char
w_buf[4]; char * p_wbuf; int
r_num; int
cmd; memset (r_buf,0, sizeof (r_buf)); memset (w_buf,0, sizeof (r_buf)); p_wbuf=w_buf; if (pipe(pipe_fd)<0) { printf ( "pipe create error\n" ); return
-1; } if ((pid=fork())==0) { printf ( "\n" ); close(pipe_fd[1]); sleep(3); //确保父进程关闭写端 r_num=read(pipe_fd[0],r_buf,100); printf ( "read num is %d the data read from the pipe is %d\n" ,r_num, atoi (r_buf)); close(pipe_fd[0]); exit (); } else
if (pid>0) { close(pipe_fd[0]); //read strcpy (w_buf, "111" ); if (write(pipe_fd[1],w_buf,4)!=-1) printf ( "parent write over\n" ); close(pipe_fd[1]); //write printf ( "parent close fd[1] over\n" ); sleep(10); } } /************************************************** * 程序输出结果: * parent write over * parent close fd[1] over * read num is 4 the data read from the pipe is 111 * 附加结论: * 管道写端关闭后,写入的数据将一直存在,直到读出为止. ****************************************************/ |
向管道中写入数据:
对管道的写规则的验证1:写端对读端存在的依赖性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 |
#include <unistd.h> #include <sys/types.h> main() { int
pipe_fd[2]; pid_t pid; char
r_buf[4]; char * w_buf; int
writenum; int
cmd; memset (r_buf,0, sizeof (r_buf)); if (pipe(pipe_fd)<0) { printf ( "pipe create error\n" ); return
-1; } if ((pid=fork())==0) { close(pipe_fd[0]); close(pipe_fd[1]); sleep(10); exit (); } else
if (pid>0) { sleep(1); //等待子进程完成关闭读端的操作 close(pipe_fd[0]); //write w_buf= "111" ; if ((writenum=write(pipe_fd[1],w_buf,4))==-1) printf ( "write to pipe error\n" ); else printf ( "the bytes write to pipe is %d \n" , writenum); close(pipe_fd[1]); } } |
原文:http://www.cnblogs.com/bracken/p/3642086.html