文件描述符和exec的关系

本文探讨了exec系统调用与文件描述符之间的关系,详细解释了默认情况下文件描述符在exec调用前后保持不变的特性,以及如何使用close-on-exec标志(FD_CLOEXEC)来控制文件描述符在exec成功后自动关闭的行为。通过示例程序展示了标准输出文件描述符在设置和未设置FD_CLOEXEC标志时的不同表现。

文件描述符和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  827 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//这个时候,会打印错误信息到标准错误输出
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值