Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 测验中的分叉和管道混淆_C_Linux_Pipe_Fork - Fatal编程技术网

C 测验中的分叉和管道混淆

C 测验中的分叉和管道混淆,c,linux,pipe,fork,C,Linux,Pipe,Fork,这是我班上的一个小测验,涉及到叉子和烟斗的概念。我只是对这个代码有一些困惑 1 ifpid=fork==0意味着什么?是否只是使用pidprocess id检查fork,为什么循环以这个开头 2close-p[1];这部分是什么意思?关闭数组P的第一个整数 3关闭后while循环开始,如果它不是零,是否意味着它读取到p[0]的大小 4.这两行写的是什么意思,为什么它们都命名为1?它们是同时发生的吗 #include <stdio.h> #include <stdlib>

这是我班上的一个小测验,涉及到叉子和烟斗的概念。我只是对这个代码有一些困惑

1 ifpid=fork==0意味着什么?是否只是使用pidprocess id检查fork,为什么循环以这个开头

2close-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);
}

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

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

pipep创建一个管道并在数组p中返回两个文件句柄。第一个句柄是打开用于读取的管道的输出,第二个句柄是打开用于写入的管道的输入。因此closep[1]关闭管道的输入这是在从管道读取的新进程中,关闭不使用的文件描述符被认为是一种良好的做法

while循环正在检查从管道文件读取的返回代码,当没有可读取的内容时,将返回0


这些都是好问题。您可以在Linux手册页中找到关于fork和pipe的答案。如果你先从手册页了解它,你会学到更多。熟悉手册页是一件好事,因为你会发现你需要经常参考手册页,即使是非常有经验的程序员也需要这样做。