close on exec

close on exec, not on-fork  意思是如果對描述符設置了FD_CLOEXEC,使用execl執行的程序裏,此描述符被關閉,此描述符不能再被使用.  但是在使用fork產生的子進程中此描述符不被關閉,仍然可以使用。

例如:

cat   fd_cloexec_flag_test.c

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

int main(void)
{
int fd,pid;
char buffer[20];
/** 最好用open打開文件就設置了O_CLOEXEC代替用fctnl設置FD_CLOEXEC */
//fd=open(“wo.txt”,O_RDONLY|O_CLOEXEC);
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){
#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,<span class="hljs-literal">NULL</span>,<span class="hljs-number">0</span>);
<span class="hljs-built_in">memset</span>(buffer,<span class="hljs-number">0</span>,<span class="hljs-keyword">sizeof</span>(buffer) );
<span class="hljs-keyword">ssize_t</span> bytes = read(fd,buffer,<span class="hljs-keyword">sizeof</span>(buffer)<span class="hljs-number">-1</span> );
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"parent, bytes:%d,%s\n\n"</span>,bytes,buffer);

}

 

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;
}

cat  wo.txt

this is a test

輸出結果:

3
child, bytes:1,t

exe1: read fail:: Bad file descriptor
parent, bytes:14,his is a test

 

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