0

共有メモリを使用してパイプを実装しています。ライブラリではなく、ライブラリのみを記述して触れる必要がありmain()ます。

問題が発生しました:

これがmain()私のライブラリを使用する一部のユーザーのものであるとしましょうshared_memory_pipe.h:

#include "shared_memory_pipe.h"

int main() {
    int fd[2];
    shared_memory_pipe(fd);
    if (fork()) {
        while(1) {}
    }
    shared_memory_close(fd[0]);
    shared_memory_close(fd[1]);
}

この例では、子は両方の fd を閉じていますが、父親は無限ループに陥っており、自分の fd を決して閉じていません。この場合、私のパイプはまだ存在しているはずです (すべての書き込み fd が閉じられている場合、またはすべての読み取り fd が閉じられている場合、またはすべてが閉じられている場合と比較して、パイプは停止するはずです)。

前に言ったように、私はライブラリ ( shared_memory_pipe.h) だけを書きます。では、ライブラリ内で、 afork()が作成されているかどうかをどのように知ることができますか?

共有メモリ パイプへの読み取り/書き込みを終了する別のプロセスがあることをどのように知ることができるので、共有メモリ パイプを閉じるか閉じないかを知ることができますか?

とかそういうのがあったことを知っているコマンドを聞いたのですが、fork()見つからず、わかりません。

ありがとうございます!さらに情報が必要な場合はお尋ねください。

4

2 に答える 2

0

fd を閉じるのは、コードのどの部分ですか?

それがユーザーのコードであれば、fork()あなたの問題ではありません。結局のところ、呼び出し元はexecve別のプログラム (匿名パイプの一般的な使用法) に対して an を実行できるため、fd がまだ開いている場合でもライブラリ コードがプロセスから削除されるため、それを処理する方法はありません。

FD を閉じるためのライブラリ API がある場合は、それだけで十分です。とにかく、実行されたプログラムはライブラリを呼び出しません。

于 2013-01-18T14:30:17.917 に答える
0

getpid()fork の前に、親は結果をglobalに格納できpid_t pid_parentます。

後の時点よりも、プロセスは再pid_parent使用に対してテストできませんgetpid()

thangetpid()の結果がプロセスと異なる場合pid_parent、親から少なくとも 1 つの fork() 離れています。

于 2013-01-18T13:52:41.960 に答える