2016-10-04 18 views
2

シリアルポート/ dev/ttyUSB0(FTDIを使用)のデバイスを使用しています。ファイルディスクリプタを他の生成されたプロセスにリークさせたくないので、close-on-execフラグをディスクリプタ。あなたは、開口部ながらO_CLOEXECを設定することの違いは何を教えてもらえ:O_CLOEXECとTIOCEXCLの違い

#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(FD、TIOCEXCL)とクローズ(close-on-exec)設定:

#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

'TIOCEXCL'は" exec on close "ではありません。端末を「排他的」モードにする。ファイル記述子の漏洩を防ぐこととは何の関係もありません。代わりに 'fcntl(fd、F_SETFD、old_flags | FD_CLOEXEC)'を考えているかもしれません。 –

答えて

4

TIOCEXCLないセットを行いますクローズオンエグゼクティブフラグ(FIOCLEX、または同等の意味ではfcntl(fd, F_SETFD, FD_CLOEXEC))。あなたopen()ファイルがあることを確実にすること、重要なのは、それが戻る前に、あなたに別のコールを保存、close-on-execフラグを設定し、いつ

O_CLOEXECの指定:あなたはあなたが求めていたと思ったの質問に答えるために

他のスレッドがopen()の後で、その後のfcntl()の後にexec()を呼び出す可能性のある競合状態はありません。

いつもフラグを設定または解除する必要がある場合は、fcntl F_SETFDFD_CLOEXECまたは0をそれぞれ渡すことができます。

+1

'open(...、O_CLOEXEC)'は呼び出しを保存するだけではなく、フラグがアトミックに設定されていることを保証します。さもなければ、あなたがマルチスレッドプログラムを持っていれば、あるスレッドは 'open()'とそれに続く 'fcntl(...、FD_CLOEXEC)'呼び出しの間で 'exec()'を呼び出すかもしれません。 –

+0

ありがとう@ G.Sliepen - 私はそれが事実だと思ったが、それがシステム内であって、Cライブラリに実装されているものではないことを確認したかった。その情報を私の答えに加えます。 –