問題タブ [fork]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unix - fork と socket を使用する際の不適切なシャットダウンの処理
ソケット接続をリッスンし、リクエストに応じてさまざまな種類のアクションを実行するサーバーがあります。それらの 1 つは、サーバーが fork する長期データベース クエリです。
サーバーはすべてのアクティブな子のログを保持し、シャットダウンを要求されるたびに、終了する前にすべての子を殺します。サーバーがクラッシュしたり、不当に強制終了されたりして、子プロセスが孤立するという状況に数回遭遇しました。サーバーを再び元に戻そうとすると、そのアドレス/ポートが既にバインドされているため、リッスンしているソケットがバインドできないと言って拒否します。
I am looking for a way to improve this kind of situation, so that the main server process can come back right away. I've tried monitoring the parent existance from the child and exiting as soon at is gone, but this has only resulted in having zombie processes and the socket seems to still be bound.
The server is written in Python, but any explanation or suggestion in any language is welcome.
python - os.pipe および os.fork() の問題を使用する Python プログラム
最近、os.fork()を実行して 2 つのプロセスに分割するスクリプトを作成する必要がありました。子プロセスはサーバー プロセスになり、os.pipe()で作成されたパイプを使用して親プロセスにデータを返します。通常どおり、子が'r'
パイプの端を閉じ、親がパイプの端を閉じます。'w'
pipe() からの戻り値をos.fdopenでファイル オブジェクトに変換します。
私が抱えている問題は次のとおりです。プロセスが正常に分岐し、子がサーバーになります。'w'
すべてがうまく機能し、子供はパイプの開いた端にデータを忠実に書き込みます。残念ながら、パイプの親エンドは 2 つの奇妙なことを行います: A) パイプのエンドでの操作を
ブロックします。次に、パイプの端が完全に閉じ
られていない限り、パイプに置かれたデータを読み取ることができません。read()
'r'
'w'
私はすぐにバッファリングが問題であると考え、pipe.flush()呼び出しを追加しましたが、これらは役に立ちませんでした。
書き込み終了が完全に閉じられるまでデータが表示されない理由を誰かが明らかにすることはできますか? read()
そして、呼び出しをブロックしないようにする戦略はありますか?
これは、パイプを分岐または使用した初めての Python プログラムなので、単純な間違いを犯した場合はご容赦ください。
perl - Perlのフォークされたプロセス間でデータベース接続を共有するにはどうすればよいですか?
私は以前にPerlで次のプログラムを作成しました。
子プロセスの終わりがそれをやりたいと思って待っていて、プロプロセスによってDBのためにそれを操作するだろうと私は思いました。
また、DBはエラーの内容に接続されていません。
どうしたの?
c - 複数の子プロセス
特定のジョブの「一部」の部分を実行するために、同じ親を持つ複数の子プロセスを作成する方法について誰かが私を助けることができますか?
たとえば、子プロセスに適用される外部ソート アルゴリズム。各子プロセスはデータの一部をソートし、最後に親がそれらをマージします..
編集:ループで複数の子プロセスをフォークすることについて言及する必要があるかもしれません..
c - 複数の子プロセス+ストリームからの読み取り
私の最後の質問(複数の子プロセス)を参照して、私は現在、複数の子プロセスを使用して外部ソーティングの実装を作成しようとしています。
しかしもちろん、このコードはfscanfのために、入力ファイルから同じシーケンスのソートされた整数を出力します。たとえば、入力ファイルの先頭に5 1 4が含まれている場合、次のように出力されます。
(1番目の子)1 4 5
(2番目の子)1 4 5
(2つの子プロセスを使用)。fscanfは入力ストリームの先頭から整数の読み取りを開始するため。
今の私の問題は、前の子プロセスが残った時点からどのように数字を読み続けることができるかということです。たとえば、入力ファイルに5 1 4 8 5 10が含まれている場合、次のように出力できます。
(最初の子供)1 4 5
(2番目の子供)5 8 10
前もって感謝します;)
c - 子プロセスを終了し、そのステータスを execvp() から返す方法は?
私の単純なカスタム シェルでは、標準入力からコマンドを読み取り、execvp() で実行しています。この前に、現在のプロセスのフォークを作成し、その子プロセスで execvp() を呼び出し、その直後に exit(0) を呼び出します。
このようなもの:
さて、execvp() で実行されるコマンドはエラーを返しますよね? 私はそれを適切に処理したいと思っています。現在、私は常に exit(0) を呼び出しています。これは、子プロセスが常に「OK」状態になることを意味します。
execvp() 呼び出しから適切なステータスを返し、それを exit() 呼び出しに入れるにはどうすればよいですか? execvp() が返す int 値を取得し、それを 0 ではなく exit() 引数として渡す必要があります。それで十分ですか?
unix - 異なるプロセス間でファイル記述子を渡すためのポータブルな方法
ほとんどのUNIXシステムでは、プロセス間で開いているファイルを渡すことは、fork()によって子/親プロセスに対して簡単に行うことができます。ただし、子がすでにフォークされた「後」にfdを共有する必要があります。
sendmsg()が任意のプロセスで機能する可能性があることを示すWebページをいくつか見つけました。しかし、それは非常にOSに依存し、複雑に思えます。portlistenは私が見つけることができる最良の例のようですが、kqueue、pool、...のすべての魔法を隠すlibeventのような優れたラッパーライブラリを好みます。
これを行うためのライブラリ(およびポータブルな方法)があるかどうか誰かが知っていますか?
c - Cでfork()、pipe()、dup2()、exec()に問題がある
これが私のコードです:
(コードは、以下の2つの回答によって提案された変更を反映するように更新されましたが、それでも正常に機能しません...)
これが失敗するテストケースは次のとおりです。
問題は、その後シェルに戻る必要があることです。「シェル>」がさらに入力を待っているのが見えるはずです。また、「[4804] TERMINATED(Status:0)」(ただし、pidが異なる)のようなメッセージが表示されないことにも気付くでしょう。これは、2番目のプロセスが終了しなかったことを意味します。
これは機能するため、grepと関係があると思います。
2つの「終了」メッセージを簡単に確認できます...
だから、私のコードの何が問題になっていますか?
perl - Perl プログラムが fork 後に子プロセスをリープしないのはなぜですか?
内部で使用するために、Perl を使用して最低限の ping スキャナーを作成しようとしています。24 ビットの CIDR ネットワークをスキャンするため、スクリプトをシングル スレッドで実行すると、実行に時間がかかりすぎます。プロセスを高速化するために fork 機能を追加しようとしましたが、一度にアクティブな子プロセスが 1 つしかなかったため、最初の試行にはほぼ同じ時間がかかりました。
私はperlipcドキュメントとPerl Cookbookで子プロセスを読み、2 番目のバージョンを思いつきました:
内部ネットワークをスキャンすると、出力は次のようになります。
結果からわかるように、スキャンに成功したスレッドは「up」メッセージを出力し、正常に終了して、親プロセスによってリープされます。一方、他の 251 のスレッドは、'/sbin/init' に接続されたままぶら下がったままになっています。exit ステートメントの直前の子処理ブロックに 'print "Child: $currIPending\n"' を追加すると、perl スクリプトが終了した「後」に、残りの 251 プロセスからの出力が端末に表示されます。
何が起きてる?$SIG{CHLD} サブルーチンと waitpid ループを組み合わせると、すべての子プロセスが取得され、システムにゾンビやダングリング プロセスが残らないようになると考えました。
同じ息で、特定の数の子プロセスをいつでも実行できるようにしたいと考えています。いつでも「n」人の子供よりも。これは可能ですか?はいの場合、私を導くのに役立つ疑似コードを入手できますか?