O_CLOEXEC和TIOCEXCL之间的区别

时间:2016-10-04 09:00:30

标签: c linux

我在串口/ 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;
}

1 个答案:

答案 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}分别。