【发布时间】:2012-04-27 22:22:17
【问题描述】:
我指的是link中的以下代码sn-p:
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方法中的读写系统调用。这种情况下读写系统调用会不会失败?
【问题讨论】:
-
孩子不应该打电话给
exit(0),而应该打电话给_exit(0)。否则,您将在调用fork时存在的任何流刷新两次。在这个例子中没关系,但为更实际的案例树立了一个很好的例子。 -
一旦
fork()返回,两个进程是分开的;它们有单独的描述符副本,指向同一个打开的文件描述。一个进程中的关闭根本不会影响另一个进程(也许除了使另一个进程成为打开文件描述的唯一所有者之外)。文件描述符和打开文件描述的区别见POSIXopen();还有dup2()、fork()等