我在这个链接中引用了以下代码片段:
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");
}
Run Code Online (Sandbox Code Playgroud)
fork()调用之后,会有两个进程 - Parent和child.
对于父进程,else部分保持为true,因此它将关闭newsockfd.但是,子进程使用newsockfd在dostuff方法中读写系统调用.在这种情况下,读写系统调用是否会失败?
不,因为在fork复制所有打开的文件描述符并且它们不是相同的描述符时,它们只指向同一个文件.
子进程继承父进程打开文件描述符的副本.子节点中的每个文件描述符引用相同的打开文件描述(请参阅open(2))作为父节点中的相应文件描述符.这意味着两个描述符共享打开文件状态标志,当前文件偏移和信号驱动的I/O属性(请参阅fcntl(2)中的F_SETOWN和F_SETSIG的描述).
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |