C の親/子プロセスについて少し問題があります: 子プロセスは、フォーク後に親プロセスが開いたファイル記述子にどのようにアクセスできますか?
5 に答える
質問が親プロセスのフォークと新しいファイル記述子を開くことに関するものであると仮定すると、短い答えは次のとおりです。それはできません。
プロセス間でファイル記述子を渡すプラットフォーム固有の方法 (たとえば、UNIX ソケットで送信される SCM_RIGHTS 補助メッセージ) がありますが、それらはプロセスの親子関係に依存しません。
ファイル記述子はシステム コールで引き継がれるfork
ため、子プロセスはそれらを自由に使用できます。これが、パイプを使用した IPC (「参考文献」を参照man 2 pipe
) の通常の方法です。
フォーク後に開かれたファイル記述子にアクセスする必要がある場合は、UNIX ソケット経由で送信できますsendmsg
。sendmsg() を使用して、2 つのプロセス間でソケット経由でファイル記述子を送信する方法を参照してください。
fork() の後、子プロセスは親のファイル記述子の独自のコピーを取得します。
子の各ファイル記述子は、親の対応するファイル記述子と同じオープン ファイル記述を参照します。
ファイル記述子の独自のコピーを取得すると、子/親の関係は関係ありません。2 つの異なるプロセスが、独自のファイル記述子セットを使用して同じファイルにアクセスするのと同じです。その後、ファイルのロックと同期が機能する可能性があります。
[編集済み - 質問を読み違えて申し訳ありません。プロセスが同じメモリ空間を共有していないため、できません。フォークの前にファイル記述子を開くか、達成しようとしていることに応じて他の IPC メカニズムを使用する場合に最適]
子プロセスは親のファイル記述子を継承するため、直接使用できます。
void example()
{
int fd = open("My file", O_WRONLY );
pid_t pid = fork();
if(pid == 0)
{
/* child */
char * child_msg = "Hi there from child\n";
write(fd, my_msg, sizeof(my_msg);
/* ... other stuff */
}
else
{
/* parent */
char * parent_msg = "Hi there from parent\n";
write(fd, my_msg, sizeof(my_msg);
/* ... other stuff */
}
}
両方のメッセージが「my file」に書き込まれます
あなたの質問は不明です。
とにかく、親を使用する子プロセスでデータを使用しようとしている場合は、親から子にデータを転送できます。簡単にするために、POSIX で無名パイプを使用するだけで、and (of and functions)int pipe(int anFD[2])
を使用できます。親プロセスでは、関数を使用して書き込み/読み取りアクセスでファイルを開く必要があります。write
read
fread
fwrite
popen
これは完全なコピーであることを忘れないでくださいfork()
(親と子はページを共有しており、これらのページは読み取り専用です)。ソースページに書き込もうとしている場合、カーネルは子プロセスが唯一の所有者であるかどうかをチェックし、このソースページは書き込み可能になります)。