码迷,mamicode.com
首页 > 系统相关 > 详细

linux管道学习(一)

时间:2016-07-01 10:18:51      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

最近学习了管道 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");

 

linux管道学习(一)

标签:

原文地址:http://www.cnblogs.com/boyunzheyue2/p/5631922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!