zoukankan      html  css  js  c++  java
  • ZT fcntl设置FD_CLOEXEC标志作用

    fcntl设置FD_CLOEXEC标志作用

    分类: C/C++ linux 3217人阅读 评论(0) 收藏 举报

    通过fcntl设置FD_CLOEXEC标志有什么用?
    close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。
    eg:
    jamie@jamie-laptop:~$ cat test.c
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>

    int main(void)
    {
            int fd,pid;
            char buffer[20];
            fd=open("wo.txt",O_RDONLY);
            printf("%d/n",fd);
            int val=fcntl(fd,F_GETFD);
            val|=FD_CLOEXEC;
            fcntl(fd,F_SETFD,val);

            pid=fork();
            if(pid==0)
            {
                    //子进程中,此描述符并不关闭,仍可使用
                    char child_buf[2];
                    memset(child_buf,0,sizeof(child_buf) );
                    ssize_t bytes = read(fd,child_buf,sizeof(child_buf)-1 );
                    printf("child, bytes:%d,%s/n/n",bytes,child_buf);

                    //execl执行的程序里,此描述符被关闭,不能再使用它
                    char fd_str[5];
                    memset(fd_str,0,sizeof(fd_str));
                    sprintf(fd_str,"%d",fd);
                    int ret = execl("./exe1","exe1",fd_str,NULL);
                    if(-1 == ret)
                            perror("ececl fail:");
            }        

            waitpid(pid,NULL,0);
            memset(buffer,0,sizeof(buffer) );
            ssize_t bytes = read(fd,buffer,sizeof(buffer)-1 );
            printf("parent, bytes:%d,%s/n/n",bytes,buffer);
    }

    jamie@jamie-laptop:~$ cat exe1.c
    #include <fcntl.h>
    #include <stdio.h>
    #include <assert.h>
    #include <string.h>

    int main(int argc, char **args)
    {
            char buffer[20];
            int fd = atoi(args[1]);
            memset(buffer,0,sizeof(buffer) );
            ssize_t bytes = read(fd,buffer,sizeof(buffer)-1);
            if(bytes < 0)
            {
                    perror("exe1: read fail:");
                    return -1;
            }
            else
            {
                    printf("exe1: read %d,%s/n/n",bytes,buffer);
            }
            return 0;
    }

    jamie@jamie-laptop:~$ gcc -o exe1 exe1.c
    jamie@jamie-laptop:~$ gcc -o test test.c
    jamie@jamie-laptop:~$ cat wo.txt
    this is a test
    jamie@jamie-laptop:~$ ./test
    3
    child, bytes:1,t                               //子进程中可使用fd

    exe1: read fail:: Bad file descriptor  //execl调用的程序中不能使用fd
    parent, bytes:14,his is a test          //父进程中当然能使用fd

  • 相关阅读:
    Pixel XL编译和烧录Android 8.0
    公式编辑器CVE-2018-0798样本分析
    CVE-2021-33739 EOP漏洞分析
    Firefox 设置 Burpsuite 代理抓取本地数据包
    前端ECharts框架绘制各种图形
    c 除法反汇编算法
    IDA sig签名批量脚本
    从零构建自己的远控•客户端设计面向对象(13)
    从零构建自己的远控•AES加解密Demo(12)
    从零构建自己的远控•图像切割算法构思(11)
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3512625.html
Copyright © 2011-2022 走看看