文件描述符和exec的关系
-
默认情况下,由exec()调用进程打开的文件描述符,在exec()执行过程中,甚至执行结束之后的新程序中,都是有效不变的
-
close-on-exec标志(FD_CLOEXEC):内核为每个文件描述符提供了执行时关闭标志,当exec()执行成功之后,会自动关闭设置了FD_CLOEXEC标志的文件描述符,如果exec()调用失败,文件描述符依然会保持打开状态
-
实例程序1:
#include <stdbool.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <fcntl.h> int main(int argc, char *argv[]) { int flags; if (argc > 1) { flags = fcntl(1, F_GETFD); //获取当前文件描述符的相关信息 flags |= FD_CLOEXEC; //加上标志FD_CLOEXEC //fcntl(1, F_SETFD, flags); //为标准输出设置FD_CLOEXEC标志 } execlp("ls", "ls", "-l", argv[1], (char *)NULL); //执行ls -l命令 return 0; } //输出结果 root@ubuntu:/home/farsight/c_test# ./16 test.log -rw-r--r-- 1 root root 29 8月 27 00:31 test.log //因为标准输出没有设置FD_CLOEXEC标志,当execlp用ls程序替代之后,标准输出依然处于打开状态,如果设置了FD_CLOEXEC标志,那么标准输出在execlp执行成功之后,会关闭,此时运行程序的结果如下: root@ubuntu:/home/farsight/c_test# ./16 test.log ls: write error: Bad file descriptor//这个时候,会打印错误信息到标准错误输出