我在串口/ dev / ttyUSB0上使用设备(使用FTDI),我不想将任何文件描述符泄漏给其他生成的进程,所以我在描述符上设置了close-on-exec标志。你能告诉我在打开时设置O_CLOEXEC有什么区别:
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int fd, rc;
fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_CLOEXEC);
if(fd < 0)
{
perror("error open:");
exit(-1);
}
rc = close(fd);
if(rc != 0)
{
perror("error close:");
exit(-1);
}
return 0;
}
用ioctl设置close-on-exec(fd,TIOCEXCL):
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int fd, rc;
fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY);
if(fd < 0)
{
perror("error open:");
exit(-1);
}
rc = ioctl(fd, TIOCEXCL);
if(rc != 0)
{
perror("error ioctl:");
exit(-1);
}
rc = close(fd);
if(rc != 0)
{
perror("error close:");
exit(-1);
}
return 0;
}
答案 0 :(得分:4)
TIOCEXCL
不设置close-on-exec标志(即FIOCLEX
,或等同于fcntl(fd, F_SETFD, FD_CLOEXEC)
)。
回答你认为你在问的问题:
当O_CLOEXEC
文件将在返回之前设置close-on-exec标志时指定open()
,保存另一个调用,并且重要的是,确保没有竞争条件,其他线程可能在exec()
之后但在随后的open()
之前致电fcntl()
。
如果您确实需要在任何其他时间设置或取消设置标记(我从未需要),您可以fcntl F_SETFD
执行此操作,传递FD_CLOEXEC
或{{1}分别。