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

  • 相关阅读:
    Java8部分新特性的学习
    SurfaceView的基本使用
    Android Apk的反编译和加密
    Notification的基本用法以及使用RemoteView实现自定义布局
    Anroid事件分发
    Xmpp学习之Asmack取经-asmack入门(一)
    android通过DialogFragment实现时间选择
    使用官方Android-support-v7在低版本上使用ActionBarActivity
    五一后总结
    Android在有存储卡和无存储卡情况下拍照后固定尺寸和压缩大小
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3512625.html
Copyright © 2011-2022 走看看