fcntl设置FD_CLOEXEC标志有什么用
来源:互联网 发布:微信克隆软件 编辑:程序博客网 时间:2024/04/30 01:56
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; //此处去掉,就可以在execl函数中访问文件描述符fd,前提是fd作为参数传递给execl
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
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; //此处去掉,就可以在execl函数中访问文件描述符fd,前提是fd作为参数传递给execl
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
转载:http://blog.csdn.net/wocjj/article/details/7601499
- fcntl设置FD_CLOEXEC标志有什么用
- 通过fcntl设置FD_CLOEXEC标志有什么用?
- 通过fcntl设置FD_CLOEXEC标志有什么用?
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC标志作用
- fcntl设置FD_CLOEXEC
- fcntl设置FD_CLOEXEC
- fcntl FD_CLOEXEC
- fcntl & FD_CLOEXEC
- fcntl的FD_CLOEXEC标志位与exec族
- fcntl设置FD_CLOEXEC && fcntl(文件描述符操作)
- DirectX 3D_实践之DirectX3D中通过XFile文件来创建网格
- linux CentOS中top命令参数说明
- C++中extern;stdafx.h
- ORACLE 函数大全
- android报错:connect failed: EHOSTUNREACH (No route to host)
- fcntl设置FD_CLOEXEC标志有什么用
- html5中的画布canvas----画出简单的矩形、三角形
- EXT下拉框联动
- Cheatsheet: 2013 05.15 ~ 05.31
- 无锁HashMap的原理与实现
- 设计模式(19)---->备忘录模式
- 图的存储结构(十字链表、邻接多重表、边集数组)
- Fragment 间的通讯和思考
- Shell编程基础