操作系统的管道示例问题

例如: 用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);/*把buf中字符写入管道*/
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); /*把buf中字符写入管道*/
exit(0);
}
else /*父进程返回*/
{
wait(0);
read(fd(0), s, 30); /*父进程读管道中字符*/
printf("%s", s);
}

return 0;
}
温馨提示:答案为网友推荐,仅供参考
相似回答