• fcntl设置FD_CLOEXEC标志作用【转】


    本文转载自:https://blog.csdn.net/ustc_dylan/article/details/6930189

    通过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

  • 相关阅读:
    [Swift]LeetCode156.二叉树的上下颠倒 $ Binary Tree Upside Down
    [Swift]LeetCode155. 最小栈 | Min Stack
    [Swift]LeetCode154. 寻找旋转排序数组中的最小值 II | Find Minimum in Rotated Sorted Array II
    CXF生成client注意事项
    使用oracle10g官方文档找到监听文件(listener.ora)的模板
    在Vi里面实现字符串的批量替换
    C语言之基本算法12—谁是冠军
    虚拟机 minimal 安装增强包
    ZOJ
    leetcode Reverse Nodes in k-Group
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/10709124.html
Copyright © 2020-2023  润新知