ファイルの操作とプロセス

ファイルの操作とプロセス

2つの異なるプロセス(親と子)が同じテキストファイルを表示して作業できますか?

これを行いましたが、両方のプロセスでファイルを開くにはfopen()を使用する必要があります。私の期待は、プロセスの1つがファイルを開き、他のプロセスがそれを見て操作できることです。

答え1

~からfork(2)手動私のOpenBSDシステムで(ハイライト):

子プロセスには、親プロセス記述子の独自のコピーがあります。これらの記述子は同じ基本オブジェクトを参照するため、たとえば次のようになります。ファイルオブジェクトのファイルポインタは、子と親の間で共有されます。lseek(2)、子プロセスの記述子が後続read(2) またはwrite(2)親プロセス記述子に影響を与える可能性があります。さらに、シェルはこの記述子のコピーを使用して標準入力と出力を設定し、新しく作成されたプロセスのパイプを設定します。

これは、子プロセスをフォークする前に親プロセスでファイルを開くと、両方のプロセスが同じファイルを開くことを意味します。ただし、子プロセスがファイルを読み取ると、親プロセスのファイルポインタも移動されます。

両方のプロセスでファイルにアクセスする独立して、両方のプロセスでファイルを開く必要があります。

親からファイルを開くと後ろに呼び出すfork()と、子プロセスで開かず、その逆も同様です。

答え2

これはこれを行ういくつかのサンプルコードです。

#include <err.h>
#include <stdio.h>
#include <unistd.h>

char buf[8];

int main(int argc, char *argv[])
{
    int ch, fd[2], rv;

    pipe(fd);

    switch (fork()) {
    case -1:
        err(1, "could not fork");
    case 0:                    // child
        rv = lseek(STDIN_FILENO, -7, SEEK_END);
        if (rv == -1) err(1, "could not seek");
        sleep(3);
        close(fd[1]);
        break;
    default:                   // parent
        close(fd[1]);
        read(fd[0], &ch, 1);
        read(STDIN_FILENO, buf, 7);
        printf("read '%s'\n", buf);
    }
    return 0;
}

親プロセスは子プロセスを待つのをブロックし、子プロセスは標準入力から7を引いた値を見つけ、pipe(2)親プロセスを終了します。これにより、子プロセスが共有ファイルポインタを移動した場所にある共有記述子からデータを読み取る親プロセスのブロックが解除されます。

$ make sharedseek
cc     sharedseek.c   -o sharedseek
$ echo asdfasdfasdf123456 > x
$ ./sharedseek < x
read '123456
'
$ 

標準入力が見つからないと動作しません。また、パイプ(またはある種の通信)が実際に必要です。それ以外の場合は、親プロセスが子プロセスの前に実行される可能性があります。

ファイル記述子が共有されていない場合、親は子がポインタを移動した場所から読み取られません。

関連情報