免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1722 | 回复: 7
打印 上一主题 下一主题

管道应用c程序的运行问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-22 17:56 |只看该作者 |倒序浏览
初学linux,有个问题想请教
这是一个关于管道的c程序:

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
   int pipe_fd[2];
   pid_t pid;
   char buf_r[100];
   char *p_wbuf;
   int r_num;
   memset(buf_r,0,sizeof(buf_r));
   if(pipe(pipe_fd)<0)
   {
       printf("pipe create error\n");
       return -1;
       }
       if((pid=fork())==0)
       {
           printf("pid0=%d\n",pid);
          printf("\n");
          close(pipe_fd[1]);
          sleep(2);
          if((r_num=read(pipe_fd[0],buf_r,100))>0)
          {
              printf("%dnumbers read from the pipe is %s\n",r_num,buf_r);
              }
              close(pipe_fd[0]);
              exit(0);
        }
        else if(pid>0)
        {
           printf("pid=%d\n",pid);
           close(pipe_fd[0]);
           if(write(pipe_fd[1],"hello",5)!=-1);
               printf("parent write1 success!\n");
           if(write(pipe_fd[1]," pipe",5)!=-1);
               printf("parent write2 success!\n");
              close(pipe_fd[1]);
                printf("pid=%d\n",pid);
              sleep(3);
              waitpid(pid,NULL,0);
              exit(0);
           }
       }
这是它的一次运行结果:


我对它的运行顺序搞不懂,这个运行结果不是按程序顺序执行的,为什么?
望高手给于解答,谢谢

论坛徽章:
0
2 [报告]
发表于 2009-06-22 21:25 |只看该作者
两个进程并发运行

论坛徽章:
0
3 [报告]
发表于 2009-06-22 22:03 |只看该作者
父进程与子进程的管道通信。
有个系统调用可以同步两个进程。

论坛徽章:
0
4 [报告]
发表于 2009-06-23 23:08 |只看该作者
2楼的兄弟,
出现这种结果是因为时间片的原因么?
为什么子进程在自己的时间片内不运行if((r_num=read(pipe_fd[0],buf_r,100))>0)呢?
如果是条件不成立的话,为什么不往下运行呢?

论坛徽章:
0
5 [报告]
发表于 2009-06-23 23:52 |只看该作者

回复 #4 zjrxlinux 的帖子

是因为时间片的原因,子进程在执行if((r_num=read(pipe_fd[0],buf_r,100))>0)前执行了sleep(2),这时操作系统会先调度父进程运行。

论坛徽章:
0
6 [报告]
发表于 2009-06-24 00:34 |只看该作者

回复

我试过把sleep(2)语句屏蔽了,再运行,结果子进程还是在if((r_num=read(pipe_fd[0],buf_r,100))>0)语句前停住了
每次执行的结果都是printf("%dnumbers read from the pipe is %s\n",r_num,buf_r);在最后输出
晕啦,这是为什么呢?

论坛徽章:
1
双鱼座
日期:2014-08-25 19:13:11
7 [报告]
发表于 2009-06-24 14:45 |只看该作者

回复 #6 zjrxlinux 的帖子

read系统调用是阻塞的,管道没东西的时候肯定会阻塞到这里,然后等父进程往管道里面些数据,所以,read语句肯定是在父进程执行完以后才执行的。这下明白了吧?

论坛徽章:
0
8 [报告]
发表于 2009-06-25 17:12 |只看该作者

回复 #7 fxpbupt 的帖子

明白 ,感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP