本文主要是介绍关于FD_CLOEXEC标志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#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的运行结果。
这篇关于关于FD_CLOEXEC标志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!