从测验中分叉和管道混乱

时间:2015-04-24 04:14:44

标签: c linux pipe fork

这是我班上的一个测验,它围绕fork和pipe调用概念。我对这段代码只有几个混淆。

1)if((pid = fork()== 0)是什么意思?它只是使用pid(进程id)检查fork,为什么循环从这开始?

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

3)while循环在关闭后开始,是否意味着如果它不为零则读入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);
}

1 个答案:

答案 0 :(得分:0)

你真的应该RTFM但是: -

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

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

  3. while循环正在检查&#34; i&#34;从管道文件读取的返回代码,当没有任何内容可读时,它将返回0。