ZT fcntl设置FD_CLOEXEC标志作用
fcntl设置FD_CLOEXEC标志作用
通过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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。