在 UNIX 系统中,有一项关于 C 编程的任务:
只用fork创建一个并行进程,通过管道组织进程间的信息交换,父进程循环从管道读取,直到遇到文件末尾(子进程可以向管道写入信息)它从标准输入流中读取)。
这是程序的文本:
int main(int argc, char *argv[])
{
int fd[2];
pid_t pid;
char buf;
pipe( fd );
switch( fork() ){
case -1:
perror( "fork()" );
exit( 1 );
case 0:
close(fd[0]);
while (read(0, &buf, 1) > 0) {
write(fd[1], &buf, 1);
}
write(1, "Death child\n", 12);
close(fd[1]);
break;
default:
close(fd[1]);
while (read(fd[0], &buf, 1) > 0) {
write(1, &buf, 1);
}
write(1, "Death parent\n", 12);
close(fd[0]);
wait(NULL);
break;
}
}
我完全反汇编了它(在我看来,我做了一些改变,使代码更容易理解)。但我无法弄清楚 1.Why 在子循环的每次迭代之后:
while (read(0, &buf, 1) > 0) {
write(fd[1], &buf, 1);
}
在父母中:
while (read(fd[0], &buf, 1) > 0) {
write(1, &buf, 1);
}
我要切换到另一个进程(父进程或子进程)吗?2.如何避免无休止地等待父进程从空管道中读取?
该程序运行良好。至于问题:
然后他们混淆了......在您的计算机内存中,同时有两个进程。它们中的哪一个由哪个处理器在什么时间执行——这由操作系统内核决定。
如果进程还没有准备好执行(例如 - 等待输入),那么它就会挂起。无论哪个进程首先准备好,都会继续执行。
这就是整个过渡......从内核的角度来看,无论是父母还是孩子都没有关系。
那么来自空通道的输入呢-一般来说是您-您如何想象?!如果通道是空的,怎么能从中输入一些东西呢?这是程序并挂起读取操作。