例如: 用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语句中只有一条语句能执行要么执行子进程要么执行父进程,不可能先执行子进程之后在执行父进程吧。即使子进程和父进程是相互独立的并行的
操作系统的管道示例问题
答案:1 悬赏:0 手机版
解决时间 2021-03-11 11:58
- 提问者网友:沦陷
- 2021-03-11 08:06
最佳答案
- 五星知识达人网友:白昼之月
- 2021-03-11 08:52
首先, 需要说明的是我对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;
}
对于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;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯