我正在尝试理解管道和在C中使用fork。下面是一个调用fork()
的代码示例,然后:
pipe
并将内容打印到控制台。父进程:写入pipe
“hello world”。
int main(void)
{
pid_t pid;
int mypipe[2];
/* Create the pipe. */
if (pipe(mypipe))
{
fprintf(stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
/* Create the child process. */
pid = fork();
if (pid == (pid_t)0)
{
/* This is the child process.
Close other end first. */
close(mypipe[1]);
read_from_pipe(mypipe[0]);//read pipe and print the result to console
return EXIT_SUCCESS;
}
else if (pid < (pid_t)0)
{
/* The fork failed. */
fprintf(stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
/* This is the parent process.
Close other end first. */
close(mypipe[0]);
write_to_pipe(mypipe[1]);//write "hello world" to the pipe
return EXIT_SUCCESS;
}
}
我的理解是我们使用pipes
,它们被视为文件,以便子进程和父进程可以通信。 (这是正确的吗?)现在,由于管道正在从父项和子项中使用,孩子是否会读取空pipe
?或者pipe
是“Hello world”吗?为什么?我的猜测是它是随机的,因为子进程和父进程同时运行。这是真的 ?
答案 0 :(得分:2)
根据man 7 pipe
,&#34;如果进程尝试从空管道读取,则read(2)将阻塞,直到数据可用。&#34;。
因此,如果read
发生在write
之前,则会等到write
完成。
相反,如果read
发生在write
之后,很明显它会返回消息。
至少有一个这样的情况必须是真的,因为,仍然根据man 7 pipe
,&#34; POSIX.1-2001说写(2)s小于PIPE_BUF字节必须是原子&# 34;和PIPE_BUF
通常足以容纳超过&#34; Hello World&#34;。
因此read
将返回&#34; Hello world&#34;。