2
#include <fcntl.h>
#include <stdlib.h>
int fdrd,fdwt;
char c;
void rdwrt();
main(int argc,char *argv[])
{
    if(argc!=3)
        exit(1);
    if((fdrd=open(argv[1],O_RDONLY))==-1)
        exit(1);
    if((fdwt=creat(argv[2],0666))==01)
        exit(1);
    fork();
    rdwrt();
    exit(0);
}
void rdwrt()
{
    for(;;)
    {
        if(read(fdrd,&c,1)!=1)
            return;
        write(fdwt,&c,1);
    }
}

このプログラムは子プロセスをフォークし、親プロセスと子プロセスは同じ入力ファイルを読み込んで同じ出力ファイルに書き込もうとします。

このプログラムを次のように実行します。

[root@localhost]./a.out input output

入力ファイルの内容は次のとおりです。

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

出力ファイルは入力ファイルと同じ文字数である必要があると思いましたが、これら2つのプロセスの競合によると、文字の順序はおそらく同じではありません。

出力ファイルは次のようになります。

abcdefghijklmnonqbcdefghijklwxyczdefjklpqrstuvwxyz
abcefgklmvwxefgklmnopqrstuvw
qrstuyz
abcdhijxyz

実際には、これらの tow ファイルの文字数は異なります

[root@localhost]wc -m input output
162 input
98  output

なぜだろう?

4

1 に答える 1