fcntl的close-on-exec标志

本文详细解析了文件描述符中的close-on-exec标志及其在进程执行时的作用,通过具体实例展示了如何使用fcntl函数来设置该标志,并探讨了其对子进程的影响。此外,还对比了不同设置下输出文件内容的变化,帮助理解标志开启与关闭时的行为差异。

每个文件描述符都有一个close-on-exec标志。默认情况下,这个标志最后一位被设置为 0。这个标志符的具体作用在于当开辟其他进程调用exec()族函数时,在调用exec函数之前为exec族函数释放对应的文件描述符。


我们来看一下具体的实例。这是两个程序:

[c-sharp] view plain copy print ?
  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

<fcntl.h> int fcntl(int fd, int cmd,... /* arg */) int fcntl(int fd, int cmd) int fcntl(int fd, int cmd, long arg) int fcntl(int fd,int cmd, struct flock *lock) ==> F_GETLK F_SETLK 以上的函数请根据一下: F_DUPFD用来查找大于或等于参数arg的最小且仍未使用的文件描述符,并且复制参数fd 的文件描述符。执行成功则返回新复制的文件描述符。新描述符与fd共享同一文件表项, 但是新描述符有它自己的一套文件描述符标志,其中FD_CLOEXEC文件描述符标志被清除。 请参考dp20。 F_GETFD取得close-on-exec标志。若此标志FD_CLOEXEC位为O,代表在调用exec()相关函 数时文件将会关闭。 F_SETFD设置close-on-exec标志。该标志以参数arg的FD_CLOEXEC位决定。 F_GETFL(FL=Flags)取得文件描述符状态标志,此标志为open(的参数flags。 F_SETFL设置文件描述符状态标志,参数arg为新标志,但只允许O_APPEND、ONONBLOCK 和O_ASYNC位的改变,其他位的改变将受影响。 F_GETLK(LK=Lock)取得文件锁定的状态。 F_SETLK设置文件锁定的状态。此时flcok结构的Itype值必须是F_RDLCK、F_WRLCK或 F_UNLCK。如果无法建立锁定,则返回-1,错误代码为EACCES或EAGAIN。 F_SETLKWF_SETLK作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止。 若在等待锁定的过程中被信号中断时,会立即返回-1,错误代码为EINTR 因为我是新手学员,请根据以上的函数和他的含义做一些简单的示例,让我通俗易懂的了解他的用法,对里面的一些步骤进行注释,注释告诉我他这个是代表什么例如cmd这个位置的,内容代表什么,什么作用,因为我想了解他的用法
09-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值