关于FD_CLOEXEC标志

本文介绍了FD_CLOEXEC标志的作用及使用方法。详细解释了如何通过系统调用设置文件描述符在exec()后的关闭状态,并给出了示例代码,展示了设置前后文件描述符的状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
FD_CLOEXEC用来设置文件的close-on-exec状态标准。在exec()调用后,close-on-exec标志为0的情况,
此文件不被关闭。非零则在exec()后被关闭。默认close-on-exec状态为0,需要通过FD_CLOEXEC设置。
#include <stdio.h>

#include <unistd.h>
#include <fcntl.h>

extern char **environ;

int main(int argc,char *argv[])
{
int flag;
int ret;

flag = fcntl(1,F_GETFD,0);
printf("close-on-exec is %d\n",flag);

fcntl(1,F_SETFD,flag|FD_CLOEXEC);
flag = fcntl(1,F_GETFD,0);
printf("close-on-exec is %d\n",flag);

//system("ls -l");
ret = execve("/bin/ls",argv,environ);
if(ret == -1)
{
printf("FAULT!\n");
}
printf("AH!!!!!\n");
return 0;
}

系统调用exec族是用来执行一个可执行文件来代替当前进程的执行映像。需要注意的是,该调用并没有生成

新的进 程,而是在原有进程的基础上,替换原有进程的正文,调用前后是同一个进程,进程号PID不变。

但执行的程序变了(执行的指令序列改变了)。因其在执行可执行文件的时候,

在可执行文件结束有运行return 0,所以就不会再执行下边的printf("AH!!!!!\n");

加上FD_CLOEXEC后是关闭文件描述符1,也就是标准输出1,所以ls运行的结果不会显示出来了。

不加FD_CLOEXEC就会打印出ls的运行结果。

转载于:https://www.cnblogs.com/xiayong123/archive/2011/10/09/3717490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值