永发信息网

操作系统的管道示例问题

答案:1  悬赏:0  手机版
解决时间 2021-03-11 11:58
例如: 用C语言编写一个程序,建立一个pipe,同时父进程生成一个子进程,子进程向pipe中写入一字符串,父进程从pipe中读出该字符串。
解: 程序如下:
#include 〈stdio.h〉
main()
{
intx,fd〔2〕;
char buf〔30〕,s〔30〕;
pipe(fd);
while((x=fork())==-1);
if(x==0)
{
sprintf(buf,〃This is an example\n〃);
write(fd〔1〕,buf,30);
exit(0);
}
else
{
wait(0);
read(fd〔0〕,s,30);
printf(〃%s〃,s);
}
}
中,当创建子进程成功后,x的返回值只有一个要么=0要么大于0。即在ifelse语句中只有一条语句能执行要么执行子进程要么执行父进程,不可能先执行子进程之后在执行父进程吧。即使子进程和父进程是相互独立的并行的
最佳答案
首先, 需要说明的是我对linux也不熟悉, 但用fork创建进程还是知道的.
对于windows程序员来说, 这段代码肯定比较难以理解了. 但linux则不同

在Linux下,当用fork创建进程的时候, 子进程是拷贝父进程的一个拷贝(这样的话可以避免传递很多的参数,
你用下windows的CreateProcess函数就会知道创建新进程有多麻烦了), 当然这也包括代码段了.
因此, 父进程会执行if-else而子进程同样会执行if-else, 区别它们的就是fork的返回值. 子进程由于
函数返回值是0所以会执行if() {}后的代码段, 而父进程则执行else{}代码段.
注: 父进程的fork返回子进程的pid(肯定大于0的), 子进程的fork返回0

父进程使用wait函数进行同步, 等待子进程结束(返回)后, 再执行后面的read(....代码段.

这是我从别处看到的:
子进程继承父进程这些东西:
用户id
控制终端
当前工作目录
根目录
文件方式创建屏蔽字
信号屏蔽和排列
对任一打开文件描述符的在执行时关闭标志
环境
连接的共享存储段。
资源限制

你代码里有不少的全角字符, 帮你改一下:
#include <stdio.h>
int main()
{
int x, fd[2];
char buf[30], s[30];
pipe(fd);
while((x=fork())==-1);

if(x==0)
{
sprintf(buf, "This is an example\n");
write(fd(1), buf, 30);
exit(0);
}
else
{
wait(0);
read(fd(0), s, 30);
printf("%s", s);
}

return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
足鑫堂养生会地址有知道的么?有点事想过去
男生会喜欢害羞的女生吗
联想手机属于什么系统
【14年主管护师分数线】2018年主管护师考试分
尚艺艺术培训中心我想知道这个在什么地方
我想知道计算机专科升本科看些什么书
日降雨量五百毫米是怎么计算的?
庄场幼儿园在什么地方啊,我要过去处理事情
怎样在键盘上打书名号
分式的平方根如何化简,如根号3/1
新装修的房子过了3月小孩可以入住吗
湖北银杏树价格
战争时期打仗回来的人为什么很多人得了神经疾
【敌军还有30秒到达战场是什么歌】敌军还有30
干果礼品店地址有知道的么?有点事想过去
推荐资讯
瑞虎5到4s店换一次机油多少钱
灵山县龙三钱食品有限公司地址在哪,我要去那
本田crv可不可以换装17吋235轮胎
同崔员外秋宵寓直读音
下列属于生命现象的是A. 火山爆发B. 开水沸腾
去年6月的英语4级考试我438分写作0分问我能不
跟鲶鱼很像的鱼叫什么
已知空间三点A(1,2,3),B(2,-1,5),C(3,2,-5)已
福睿斯前保险杠为什么补漆有色差
如何学好政治 作文300
九洲假日公寓停车场怎么去啊,有知道地址的么
满口香烧饼地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?