父子進程對文件描述符的影響

#include <fcntl.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>

int main(int argc, char **args)
{
    char buffer[2];
    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;
}

``
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    int fd,pid;
    char buffer[20];
    printf("%d\n",fd);

#if 1
    int val=fcntl(fd,F_GETFD);
    val|=FD_CLOEXEC;
    fcntl(fd,F_SETFD,val);
#endif

    pid=fork();
    if(pid==0){
#if 1
      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);
#endif  
      char fd_str[5];
      memset(fd_str,0,sizeof(fd_str));
      sprintf(fd_str," %d\n",fd);
      int ret = execl("./exe1","exe1",fd_str,NULL);
      if(-1 == ret)
        perror("execl 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);
}
wo.txt 
hello
結論:
1.父子進程(fork,exec後的子進程)共享文件偏移量
2.打開標誌FD_CLOEXEC後,exec的子進程會關閉文件描述符,無法訪問文件。

發佈了2 篇原創文章 · 獲贊 0 · 訪問量 1923
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章