标签:
最近学习了管道 pipe,在这里进行一下总结。
这里贴一段自己的实做代码
struct node{ int a; long b; }; int main() { int field[2]; pid_t pid; char buf[256]; int returned_count; pipe(field); //fcntl(field[0], F_SETFL, O_NONBLOCK); int status; pid = fork(); if(pid < 0) { printf("Error In Fork\n"); exit(1); } if(pid == 0) { printf("In Child Process\n"); close(field[0]); node testnode; testnode.a = 1; testnode.b = 2; //sleep(10); //write(field[1],"This is a pipe test\n",strlen("This is a pipe test")); //write(field[1],"This is another pipe test\n",strlen("This is another pipe test")); write(field[1],&testnode,sizeof(testnode)); testnode.a = 10; testnode.b = 20; write(field[1],&testnode,sizeof(testnode)); exit(0); } else { printf("In Parent Process\n"); close(field[1]); //read(field[0],buf,sizeof(buf)); node ptestnode; read(field[0],&ptestnode,sizeof(node)); //printf("Msg %s from Child\n",buf); printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b); read(field[0],&ptestnode,sizeof(node)); printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b); //waitpid(pid,&status,0); } close(field[1]); }
pipe作为linux进程通讯中的一种常用手段被广泛使用,函数原型为int pipe(int filedes[2]); 其中filedes中的filedes[0]代表读 filedes[1]代表写。
再不使用fcntl函数限定的情况下,管道默认是以阻塞方式进行的。
比如父进程再使用read函数读取管道内容时,如果管道为空,则read函数会阻塞等待。如果将管道设置为读非阻塞,则父进程读取不到管道内容会直接进行下一步,不再等待。
但是父进程中如果使用了wait或waitpid函数,我发现实现效果依然和管道阻塞的情况一样,等待子进程写入,读取内容后才会进行下一步,这点有待研究。
通过read的返回值来进行判断管道中的内容是否读取完毕。
例如
1 node ptestnode; 2 int bufcount = 0; 3 bufcount = read(field[0],&ptestnode,sizeof(node)); 4 //printf("Msg %s from Child\n",buf); 5 printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b); 6 7 while(bufcount) 8 { 9 bufcount = read(field[0],&ptestnode,sizeof(node)); 10 if(!bufcount) 11 { 12 break; 13 } 14 printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b); 15 } 16 17 printf("Pipe Read Over\n");
标签:
原文地址:http://www.cnblogs.com/boyunzheyue2/p/5631922.html