分享

fcntl的FD

 antyoung 2011-11-28

#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的运行结果。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多