關於close-on-exec標誌

原文鏈接關於close-on-exec標誌

關於close-on-exec標誌  

每個文件描述符都有一個close-on-exec標誌。默認情況下,這個標誌最後一位被設置爲 0。這個標誌符的具體作用在於當開闢其他進程調用exec()
族函數時,在調用exec函數之前爲exec族函數釋放對應的文件描述符。

我們來看一下具體的實例:

這是兩個程序: file:fcntl
代碼
int main()
{
pid_t pid;
fd = open("test.txt",O_RDWR|O_APPEND);
if (fd == -1)
##printf("open err\n");
printf("fd = %d",fd);
printf("fork!\n");
fcntl(fd, F_SETFD, 1);                    
char *s="ooooooooooooooooooo";
pid = fork();
if(pid == 0)
execl("ass", "./ass", &fd, NULL);

wait(NULL);

write(fd,s,strlen(s));
close(fd);

return 0;
}

ass 源代碼
int main(int argc, char *argv[])
{
int fd;
printf("argc = %d ",argc);
fd = *argv[1];
printf("fd = %d",fd);
char *s = "zzzzzzzzzzzzzzzzzzz";
write(fd, (void *)s, strlen(s));
close(fd);
return 0;
}
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章