fcntl的close-on-exec標誌


我們來看一下具體的實例。這是兩個程序:

  1. //file:fcntl  
  2. int main()  
  3. {  
  4.     pid_t pid;  
  5.     fd = open("test.txt",O_RDWR|O_APPEND);  
  6.     if (fd == -1)  
  7.     ##printf("open err/n");  
  8.     printf("fd = %d",fd);  
  9.     printf("fork!/n");  
  10.     fcntl(fd, F_SETFD, 1);                      
  11.     char *s="ooooooooooooooooooo";  
  12.     pid = fork();  
  13.     if(pid == 0)  
  14.     execl("ass""./ass", &fd, NULL);  
  15.     wait(NULL);  
  16.     write(fd,s,strlen(s));  
  17.     close(fd);  
  18.     return 0;  
  19. }  
  20. //ass 源代碼  
  21. int main(int argc, char *argv[])  
  22. {  
  23.     int fd;  
  24.     printf("argc = %d ",argc);  
  25.     fd = *argv[1];  
  26.     printf("fd = %d",fd);  
  27.     char *s = "zzzzzzzzzzzzzzzzzzz";  
  28.     write(fd, (void *)s, strlen(s));  
  29.     close(fd);  
  30.     return 0;  
  31. }  

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

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