两个fork的简单问题
1、
pid_t pid;
bind(...);
listen(...);
while(1)
{
connfd = accept(....);
if((pid = fork()) == 0)
{
//派生出来的自进程,为什么要关闭listenfd?关闭了岂不是父进程也无法再用
close(listenfd);
doit(connfd);
close(connfd);
close(connfd);
}
2、
pid_t pid;
int listenfd,connfd;
listenfd = socket(...);bind(...);
listen(...);
while(1)
{
connfd = accept(....);
if((pid = fork()) == 0)
{
//派生出来的自进程,为什么要关闭listenfd?关闭了岂不是父进程也无法再用
close(listenfd);
doit(connfd);
close(connfd);
exit(0)
}
close(connfd);
}
2、
fork重复执行,fork上面的代码会不会重复执行?如果会,那出错怎么办?还是说fork是复制了本进程,然后继续向下执行?
q1、是因为UNIX下的文件都有一个引用计数。引用计数它是当前打开着的引用。该文件或套接口的描述字的个数。accept返回后与connfd关联的文件表项计数为1,fork返回后,两个描述字就在父子进程之间共享,因此这两个套接字相关联的引用计数值从2减为1。该套接口真正清理和释放资源要等到其引用为0时进行。(UNIX网络编程 P97)
q2、fork后是从当前位置向下执行的。