测验中的叉子和管道混淆

fork and pipe confusion from quiz

这是我 class 的测验,它涉及叉子和管道的概念。我只是对这段代码有些困惑。

1) if((pid = fork() == 0) 是什么意思?难道只是用pid(process id)检查fork,为什么loop要从这个开始?

2)关闭(p[1]);这部分是什么意思?关闭数组 P 的第一个整数?

3)while循环在close后开始,如果p[0]不为0,是不是读入p[0]的size?

4.The 两行,什么意思,为什么都命名为1?它们是同时发生的吗?

#include <stdio.h>
#include <stdlib>
#include <string.h>
#include <sys/wait.h>



int main(int argc, char *argv[])
{

int p[2];

int i, pid, status;
char buffer[20];
pipe(p);
if((pid = fork() == 0) {

close (p[1]);
while (( i = read (p[0], buffer, sizeof("abcdefghi"))) != 0)
{ buffer [i] = '[=10=]';
printf("read %d bytes: %s\n", i, buffer);

}
close(p[0]);
exit (0);
}

write(p[1], "abcdefghi', sizeof("abcdefghi"));

write(p[1], "123456789', sizeof("123456789"));

close(p[0]);
close(p[1]);
while(wait(&status)!= pid);
return(0);
}

您确实应该使用 RTFM,但是 :-

  1. fork() 从同一行代码创建当前过程 运行 的相同副本。两个副本之间的唯一区别是来自 fork() 的 return 代码。如果您在新创建的副本中,这将为 0;如果您在原始可执行文件中,则为新创建副本的进程 ID(如果出现问题,则为 -1)。

  2. pipe(p) 在数组 "p" 中创建一个管道和 returns 两个文件句柄。第一个句柄是为读取而打开的管道的输出,第二个句柄是为写入而打开的管道的输入。所以 close(p[1]) 关闭管道的输入(这是在从管道读取的新进程中,关闭您不使用的文件描述符被认为是好的做法!)

  3. while 循环正在检查 "i" 从管道文件读取的 return 代码,当没有可读取的内容时,这将 return 0。