fcntlのclose-on-execマーク
1571 ワード
http://blog.163.com/tlost_ヘブンズ/blog/static/79246122200919102239562451/
各ファイルの記述子にはクローズド?オン?execのマークがあります.デフォルトでは、このフラグの最後のビットは0に設定されています.このフラグの具体的な役割は、他のプロセスがexec()族関数を呼び出すときに、exec関数を呼び出す前にexec族関数に対応するファイル記述子を解放することである.具体的な例を見てみます. これは二つのプログラムです.
//file:fcntlコードint main(){pidtpid;fd=open(「test.txt」、OuDWR(=uAPPEND);if(fd=-1)print(Fd=print) char**s=「ooooooooooooooooooooooooooooooooooooooooooooooooo」、pid=fork();if(pid=0)execl(「ass」、「.ass」、&fd、NULL);
wait(NULL)
ソースコードint main(intargc、char*argv[]){int fd;prntf("argc=%d"、argc);fd=*argv[1];prntf("fd=%d"、fd);char*s=="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzファイル~fcntl(fd,FuSETFD,1)この文はfdのclose-on-execフラグを1に設定します.このフラグをオンにします.では、子プロセスがexecl関数を呼び出します.
の場合、execl実行クラスでは、クラスはfd内に書き込むことができません.
execl関数を起動する前に、システムは既にサブプロセスのこのファイル記述子を閉じました.(tention:ここは
子供プロセス!)
ただし、fcntl(fd,FuSETFD,1)
に変更する
fcntl(fd,FuSETFD,0)
この文をそのまま注釈してもいいです.assはこのファイルの説明書の中に任意にものを書き足すことができます.
PS:fcntlをオープンに設定すると1に設定されますが、このファイル記述子は依然としてメインプロセスで動作します.
プログラム実行の結果を以下にまとめます.
この文を実行するとfcntl(fd,FuSETFD,1)
fd=3
fork
argc=2
fd=3 test.txtの内容は:
オーロラ
fcntl(fd,FuSETFD,1)をコメントしたり、1を0に変更したりした場合
結果:
fd=3
fork
argc=2
fd=3
lost test.txtの内容は:
zzzzzzzzzzzzzzzzzzzzzzzooooooooooooooo
各ファイルの記述子にはクローズド?オン?execのマークがあります.デフォルトでは、このフラグの最後のビットは0に設定されています.このフラグの具体的な役割は、他のプロセスがexec()族関数を呼び出すときに、exec関数を呼び出す前にexec族関数に対応するファイル記述子を解放することである.
//file:fcntlコードint main(){pidtpid;fd=open(「test.txt」、OuDWR(=uAPPEND);if(fd=-1)print(Fd=print) char**s=「ooooooooooooooooooooooooooooooooooooooooooooooooo」、pid=fork();if(pid=0)execl(「ass」、「.ass」、&fd、NULL);
wait(NULL)
write(fd,s,strlen(s));
close(fd);
return 0;ソースコードint main(intargc、char*argv[]){int fd;prntf("argc=%d"、argc);fd=*argv[1];prntf("fd=%d"、fd);char*s=="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzファイル~fcntl(fd,FuSETFD,1)この文はfdのclose-on-execフラグを1に設定します.このフラグをオンにします.では、子プロセスがexecl関数を呼び出します.
の場合、execl実行クラスでは、クラスはfd内に書き込むことができません.
execl関数を起動する前に、システムは既にサブプロセスのこのファイル記述子を閉じました.(tention:ここは
子供プロセス!)
ただし、fcntl(fd,FuSETFD,1)
に変更する
fcntl(fd,FuSETFD,0)
この文をそのまま注釈してもいいです.assはこのファイルの説明書の中に任意にものを書き足すことができます.
PS:fcntlをオープンに設定すると1に設定されますが、このファイル記述子は依然としてメインプロセスで動作します.
プログラム実行の結果を以下にまとめます.
この文を実行するとfcntl(fd,FuSETFD,1)
fd=3
fork
argc=2
fd=3 test.txtの内容は:
オーロラ
fcntl(fd,FuSETFD,1)をコメントしたり、1を0に変更したりした場合
結果:
fd=3
fork
argc=2
fd=3
lost test.txtの内容は:
zzzzzzzzzzzzzzzzzzzzzzzooooooooooooooo