繁体   English   中英

测验中叉子和管子的混乱

[英]fork and pipe confusion from quiz

这是我班上的一个测验,它涉及叉子和管子的概念。 我对此代码有些困惑。

1)if((pid = fork()== 0)意味着什么?它只是使用pid(process id)检查fork,为什么循环以此开始?

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

3)while循环在关闭后开始,这是否表示如果不为p [0],它会读入p [0]的大小?

4.这两条写线是什么意思,为什么它们都命名为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] = '\0';
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()的返回码。 如果您在新创建的副本中,则该值为0;如果您在原始可执行文件中,则为该新副本的进程ID(如果出现问题,则为-1)。

  2. pipe(p)创建一个管道,并在数组“ p”中返回两个文件句柄。 第一个句柄是打开以供读取的管道的输出,第二个句柄是打开以供写入的管道的输入。 因此close(p [1])关闭管道的输入(这是在从管道读取的新进程中,关闭不使用的文件描述符被认为是一种好习惯!)

  3. while循环正在检查“ i”从管道文件中读取的返回代码,如果没有要读取的内容,它将返回0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM