gpt4 book ai didi

c - vfork() 与 pipeline() 的用法

转载 作者:行者123 更新时间:2023-11-30 19:06:31 27 4
gpt4 key购买 nike

我从手册页中了解到,vfork()子进程使用与父进程相同的资源。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int fd[2], nbytes;
pid_t childpid;
char string[] = "Hello, world!\n";
char readbuffer[80];

pipe(fd);

if((childpid = vfork()) == -1)
{
perror("fork");
exit(1);
}

if(childpid == 0)
{
/* Child process closes up input side of pipe */
close(fd[0]);

/* Send "string" through the output side of pipe */
write(fd[1], string, (strlen(string)+1));
exit(0);
}
else
{
/* Parent process closes up output side of pipe */
close(fd[1]);

/* Read in a string from the pipe */
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s", readbuffer);
}

return(0);
}

据我了解

close(fd[0]); // In child
write(fd[1], string, (strlen(string)+1));

当我们关闭管道读取端 fd[0] 时,子进程中的上述代码行应该会导致错误 13 SIGPIPE。但这并没有发生安装的输出是收到字符串:Hello, world!谁能给我解释一下原因吗?

最佳答案

vfork() 函数是 POSIX 2004 的一部分,但不是 POSIX 2008 的一部分,POSIX 2008 是当前版本(又名 POSIX 2016 )。您可以用vfork()做什么是非常非常有限的。手册上说:

The vfork() function shall be equivalent to fork(), except that the behavior is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec family of functions.

您无法调用 close()来自 child ;你不能打电话write() .

TL;DR — 不要使用 vfork() .

如果您有勇气并且对界面的复杂性感到满意,您可以研究 posix_spawn() 功能及其支持人员的 20 多个功能开始 posix_spawn_ 。 OTOH,经典 Unix 中的“fork(),然后在子进程中进行操作”范例有很多优点;它比 posix_spawn 更容易理解。功能,最终也更加灵活。并非所有平台都必须实现posix_spawn() ,或者。

关于c - vfork() 与 pipeline() 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com