• 【引用】关于closeonexec标志


    每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()
    族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。
      1. 我们来看一下具体的实例:

    这是两个程序: file:fcntl
    代码
    int main()
    {
    pid_t pid;
    fd = open("test.txt",O_RDWR|O_APPEND);
    if (fd == -1)
    ##printf("open err\n");
    printf("fd = %d",fd);
    printf("fork!\n");
    fcntl(fd, F_SETFD, 1);                    
    char *s="ooooooooooooooooooo";
    pid = fork();
    if(pid == 0)
    execl("ass", "./ass", &fd, NULL);

    wait(NULL);

    write(fd,s,strlen(s));
    close(fd);

    return 0;
    }

    ass 源代码
    int main(int argc, char *argv[])
    {
    int fd;
    printf("argc = %d ",argc);
    fd = *argv[1];
    printf("fd = %d",fd);
    char *s = "zzzzzzzzzzzzzzzzzzz";
    write(fd, (void *)s, strlen(s));
    close(fd);
    return 0;
    }
    PS:那个test.txt提前已经创建 为空文件~

    fcntl(fd, F_SETFD, 1) 此句将fd的close-on-exec 标志设置为1,开启此标志。那么当子进程调用execl函数
    时,execl执行ass,ass是不能向fd内写入的,因为在调用execl函数之前系统已经讲子进程的此文件描述符关闭了。(attention:这里是子进程!)
    但是如果将 fcntl(fd, F_SETFD, 1)
    改为
    fcntl(fd, F_SETFD, 0)
    或者直接将此句注释掉,那么,ass便可以向这个文件描述符中任意添写东西了~~
    PS:如果将fcntl设置为开启,即设置为1,那么, 此文件描述符依然是可以被主进程操作的。
    下面将程序执行的结过给大家:
    当执行此句fcntl(fd, F_SETFD, 1)
    fd = 3fork!
    argc = 2 fd = 3
    test.txt中的内容为:
    ooooooooooooooooooo
    当将fcntl(fd, F_SETFD, 1)注释掉或者将 1改为 0时
    结果:
    fd = 3fork!
    argc = 2 fd = 3lost
    test.txt中的内容为:
    zzzzzzzzzzzzzzzzzzoooooooooooooooooooooo
  • 相关阅读:
    WordPress Ambience主题‘src’参数跨站脚本漏洞
    Linux Kernel fallocate实现拒绝服务漏洞
    WordPress Content Slide插件跨站请求伪造漏洞
    WordPress Mail Subscribe List插件‘sml_name’参数HTML注入漏洞
    WordPress NextGEN Gallery插件‘swfupload.swf’多个跨站脚本漏洞
    由Firefox的NoScript插件升级想到的
    在长春继续吃
    NB到SB
    边走边记
    为什么不坐热气球?
  • 原文地址:https://www.cnblogs.com/zhihaowang/p/10128554.html
Copyright © 2020-2023  润新知