在 Linux 中,子过程能够继承父过程正在监听的端口,这是因为子过程会继承父过程关上的文件描述符,而监听的套接字是通过文件描述符来实现的。所以当子过程继承父过程关上的套接字时,也就继承了这个套接字对应的文件描述符,从而能够持续监听这个端口。
当子过程敞开继承的端口时,父过程依然能够应用这个端口。这是因为在 Linux 中,每个关上的文件都有一个援用计数。当一个过程敞开一个文件时,内核会将文件的援用计数减 1。只有当所有过程都敞开了这个文件,援用计数才会降为 0,此时内核才会开释文件描述符和相应的资源。在咱们这个例子中,当子过程敞开继承的端口时,父过程依然放弃着对该端口的监听,因而该端口的援用计数并不会降为 0,所以父过程依然能够应用这个端口。
须要留神的是,当一个过程关上一个端口并监听它时,该端口会被标记为已被占用。只有当该过程开释了该端口,或者该过程退出时,该端口才会被标记为未被占用。因而,如果子过程没有在退出前敞开继承的端口,即便父过程曾经退出,该端口依然会被标记为已被占用,直到操作系统重新启动或者手动开释该端口。