Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在分叉过程中如何处理套接字连接_Sockets_Process_Tcp_Fork_Port - Fatal编程技术网

Sockets 在分叉过程中如何处理套接字连接

Sockets 在分叉过程中如何处理套接字连接,sockets,process,tcp,fork,port,Sockets,Process,Tcp,Fork,Port,例如,我有一个充当TCP服务器的程序,它侦听端口5000 现在我想运行另一个命令行进程,与此服务器并行运行。我知道正确的方法是分叉服务器,而不是调用“exec” 我的问题是,子进程是否也“拥有”这个端口5000?如果要释放此端口5000,是否需要同时终止父进程和子进程 我只是很好奇这个套接字连接在forking中是如何处理的 首先,accept()传入连接。接受进程现在有了监听套接字和新接受的套接字的句柄 分叉和: 在儿童中: 关闭监听插座 使用已接受的套接字执行操作 在父项中: 关闭已接受

例如,我有一个充当TCP服务器的程序,它侦听端口5000

现在我想运行另一个命令行进程,与此服务器并行运行。我知道正确的方法是分叉服务器,而不是调用“exec”

我的问题是,子进程是否也“拥有”这个端口5000?如果要释放此端口5000,是否需要同时终止父进程和子进程

我只是很好奇这个套接字连接在forking中是如何处理的

  • 首先,
    accept()
    传入连接。接受进程现在有了监听套接字和新接受的套接字的句柄
  • 分叉和:
    • 在儿童中:
    • 关闭监听插座
    • 使用已接受的套接字执行操作
    • 在父项中:
    • 关闭已接受的套接字
    • 继续接受循环
  • 当关闭对句柄的所有引用时,将回收各种套接字资源。如果进程终止,则其所有句柄都将隐式关闭。因此,如果子进程关闭了它继承到侦听套接字的句柄,则该套接字剩余的唯一句柄存在于父进程中。然后,当父进程终止或显式关闭此句柄时,侦听套接字将被回收。

    是,确实如此

    无论何时创建子进程,它都会从父进程获取文件描述符表的副本。每个文件描述符对应一个引用计数,即当前访问文件/套接字的进程数。所以,如果一个套接字在主进程中打开,并且创建了一个子进程,那么引用计数会增加,因为它现在在子进程中也是打开的,当它在任何进程中关闭时,它会减少。当引用计数达到零时,套接字最终关闭

    你是在有新连接传入时还是之前分叉的?@Simone,我在建立新连接后分叉。@ushfish所以Matt的答案是正确的。