gpt4 book ai didi

c - fork后关闭的描述符在其他进程中是否无效?

转载 作者:行者123 更新时间:2023-12-02 06:20:53 26 4
gpt4 key购买 nike

我指的是此 link 中的以下代码片段:

while (1)
{
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
pid = fork();
if (pid < 0)
error("ERROR on fork");
if (pid == 0)
{
close(sockfd);
dostuff(newsockfd);
exit(0);
}
else
close(newsockfd);
} /* end of while */

void dostuff (int sock)
{
int n;
char buffer[256];

bzero(buffer,256);
n = read(sock,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(sock,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
}

在 fork() 调用之后,将有两个进程 - 父进程和子进程。

对于父进程来说,else部分成立,所以会关闭newsockfd。但是newsockfd被子进程用来在dostuff方法中进行读写系统调用。这样的话读写系统调用不会失败吗?

最佳答案

不,因为在 fork 期间,所有打开的文件描述符都被复制,它们不是相同的描述符,它们只是指向同一个文件。

来自fork(2) manpage :

The child inherits copies of the parent's set of open file descriptors. Each file descriptor in the child refers to the same open file description (see open(2)) as the corresponding file descriptor in the parent. This means that the two descriptors share open file status flags, current file offset, and signal-driven I/O attributes (see the description of F_SETOWN and F_SETSIG in fcntl(2)).

关于c - fork后关闭的描述符在其他进程中是否无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358633/

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