我在这个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()调用之后,会有两个进程 - Parent和child。
对于父进程,else部分保持为true,因此它将关闭newsockfd。但是,子进程使用newsockfd在dostuff方法中进行读写系统调用。在这种情况下,读写系统调用是否会失败?
答案 0 :(得分:8)
不,因为在fork
期间所有打开的文件描述符都被复制并且它们不是相同的描述符,它们只是指向同一个文件。
子进程继承父进程打开文件的副本 描述。子中的每个文件描述符都指向相同的open 文件描述(参见open(2))作为相应的文件描述符 父母。这意味着两个描述符共享打开文件状态 标志,当前文件偏移和信号驱动的I / O属性(参见 fcntl(2)中的F_SETOWN和F_SETSIG的描述。
答案 1 :(得分:2)
子进程将在其自己的内存中拥有自己的全新“newsockfd”。那里的套接字句柄与正在关闭的父级'newsockfd'没有任何共同之处。