Tag: execl

解决socket在execl之后被自动继承的问题

本文同步自:https://zohead.com/archives/close-socket-after-execl/ Linux下的进程在创建子进程(fork)后,子进程会自动继承父进程的文件描述符,这种机制在没有 execl 运行时一般都没有问题,而且也比较方便在子进程中直接使用父进程中打开的文件描述符,但如果子进程通过 execl 类函数运行新的程序时,这些继承的文件描述符却没有被关闭,导致 execl 之后的程序中也有父进程中文件描述符的拷贝,有些情况就会出现错误。 由于 socket 也在这些文件描述符范围内,本文简单说下解决 socket 被自动继承的几种方法。 首先是测试程序,头文件就没列出来了。 父进程和子进程分别 sleep 10秒钟,方便外部查看打开的文件描述符,编译运行程序,使用 lsof 命令就可以看到子进程在 execl 之后的 sleep 进程中也打开了父进程的 socket 描述符(UDP连接),这不是我们想要的效果滴: [root@localhost ~]# lsof -c sleep COMMAND     PID    USER   FD        TYPE  DEVICE SIZE/OFF   NODE      NAME sleep               5750  root       cwd      DIR     8,1           4096           8145         /root sleep               5750  root      rtd         DIR     8,1           4096           2                / sleep               5750  root      txt         REG    8,1           27880         456104    /bin/sleep sleep               5750  root     mem    REG    8,1           155696       301801    /lib64/ld-2.12.so sleep               5750  root     mem    REG    8,1           1912928    301802    /lib64/libc-2.12.so sleep               5750  root     mem    REG    8,1           99158752  391655   /usr/lib/locale/locale-archive sleep               5750  root     0u        CHR    136,1      0t0                4              /dev/pts/1 sleep               5750  root     1u        CHR    136,1      0t0               4               /dev/pts/1 sleep               5750  root     2u        CHR    136,1      0t0               4               /dev/pts/1 sleep               5750  root     3u        IPv4    15022      0t0             UDP         *:5555 解决办法有如下几种: 1、比较死板的方法,在子进程 fork 之后关闭所有的 socket 描述符,在 execl 之前加上:     int fd...