問題タブ [waitpid]
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.
c - Ubuntu の wait() 関数
Ubuntu でプロセスとその動作を学習していますが、wait() で少し混乱しています。だから私の質問は:
- while(wait(NULL)>0);ステートメントの方法 は働いている?
- wait()のNULLの目的は何ですか?
ターミナルで出力を見ましたが、wait() 関数を実行しても親が実行され、子が作成されます。親の実行を停止するべきではありませんか? コードは次のとおりです。
}
私はこれが非常に不十分な質問であることを知っていますが、これは人々が学ぶ方法です:)
ありがとう
fork - 親で fork() してから wait() するのはなぜですか?
fork()、wait()、waitpid()、ゾンビ プロセスを知っています...非常に優れた本である W. Richard Stevens を読んで理解しました。
親でwait()を呼び出さないと、終了後に子がゾンビになります...これは悪いことです!
親で wait() を呼び出すと、親は子が終了するのを待ち、終了ステータスを受け取ってから続行します。書く?
fork() を一度呼び出してから、親で wait() を呼び出す多くの例を見てきました。
しかし、親が子を待ち、子が終了した後も続行する場合、実際のマルチタスクは行われません (技術的には 2 つのプロセスがありますが、論理的には役に立たない) では、なぜここで fork() を呼び出したのでしょうか?
fork() と wait() を 1 つのプロセスとして記述する代わりに、子のコードを記述してから親のコードを記述することもできたはずですが、そのほうがよいのではないでしょうか?
ありがとう!
linux - 子プロセスは互いに待機しています
3つのプロセスを作成し、それらの作業を同期させたいと思います。具体的には、最初のプロセスが2番目、2番目が3番目で待機するようにします。基本的に、作成されたのとは逆の順序で実行します。
これが私がこれまでにしたことです。
子プロセスで正しいiを取得すると想定しているため、iを使用して自分がどの子プロセスにいるかを確認しています。したがって、i = 0の場合、実際には最初の子にいます。この仮定は本当ですか?いずれにせよ、私は希望する順序を取得できません。実際、プロセスは、私が行ったwaitpid呼び出しをバイパスして、自然な順序で実行されます。何か案は?
c - システムコールfork()execvp()wait()pipe()を使用した複数のパイプの実装-単に機能していません
複数のパイプコマンドを処理するシェルを実装する必要があります。たとえば、これを処理できる必要がありますls | grep -i cs340 | sort | uniq | cut -c 5。問題は、前のコマンドの出力を次のコマンドの入力に渡していないことだと思います。コードを実行すると、出力が表示されません。私はこの擬似コードを使用しています:
複数のパイプを処理する関数のソースコードは次のとおりです。
関数execvp()は構造体の配列を取ります。解析部分をすべてチェックしましたが、正常に動作します。execute_multiple_commands()困っている機能です。
structのコードは次のとおりです。
c++ - 正しい戻りコードではなく、waitpid/wexitstatus が 0 を返す
以下のヘルパー関数を使用して、コマンドを実行し、posix システムで戻り値を取得します。以前は を使用していましたが、アプリケーションを実行して終了する前にpopenアプリケーションのリターン コードを取得することは不可能でした。popenpopenpclose
次のヘルパー関数は、プロセス フォークを作成しexecvp、目的の外部プロセスを実行するために使用し、次に、親waitpidがリターン コードを取得するために使用します。実行を拒否する奇妙なケースが見られます。
wait=trueで呼び出された場合waitpid、何があってもアプリケーションの終了コードを返す必要があります。ただし、stdout戻りコードがゼロ以外である必要があることを指定する出力が表示されますが、戻りコードはゼロです。通常のシェルで外部プロセスをテストすると、echoing$?はゼロ以外を返すため、外部プロセスが正しいコードを返さないという問題はありません。それが助けになる場合、実行されている外部プロセスは次のとおりですmount(8)(はい、使用できることはわかっていますmount(2)が、それは重要ではありません)。
コードダンプについては事前にお詫び申し上げます。そのほとんどはデバッグ/ロギングです:
コマンドは正しいパラメーターで正常に実行され、関数は問題なく続行され、WIFEXITEDが返されることに注意してくださいTRUE。ただし、WEXITSTATUS何か他のものを返す必要がある場合は、0 を返します。
c - waitpid 間違った使い方?
親からフォークされた子プロセスの終了ステータスにアクセスしようとしていますが、奇妙な答えが得られます。&status を指定するかステータスだけを指定するかによって、256 が返されることもあれば、負の値が返されることもあります。私は私が本当に近いことを知っています。EXIT_STATUSを取得する方法を誰かが少し助けてくれますか
これが私のコードです
c++ - Linux、waitpid、WNOHANG、ゾンビ
私はできる必要があります:
- プロセスをフォークしてexecvpにします(私はそれをしました)
- 子プロセスexecvpが成功したかどうかを確認します(方法がわかりません)
- 子プロセスが終了したかどうかを確認します(問題があります)
プロセスをフォークしていますが、子のexecvpが機能したか失敗したかを確認する方法がありません。それが失敗した場合、私はそれが失敗したことを知ることができる必要があります。現在使用しています
しかし、pidプロセスのexecvが失敗した場合、waitpidは-1を返さないようです。
どうすれば確認できますか?waitpidのmanページを読みましたが、はっきりしていません。多分私の英語は十分ではありません。
編集:もっと説明するために:
私はホームワークのために自分のターミナルを構築しています。入力としてコマンド文字列を取得する必要があります。たとえば、「ls」と言ってから、コマンドを実行する必要があります。
子がフォークした後、子はコマンドを実行するためにexecvpを呼び出し(文字列を解析した後)、親はコマンドの最後に「&」があるかどうかを確認する必要があります。
コマンドの最後に記号「&」が存在しない場合、親は子が実行されるのを待つ必要があります。
したがって、execvpが失敗したかどうかを知る必要があります。失敗しなかった場合、親はwaitpidを使用して、子が実行を終了するのを待ちます。失敗した場合、親は子を待ちません。
c - fork/exec/waitpid の問題
waitpid() の結果をチェックして、実行が失敗したかどうかを判断しようとしています。ただし、失敗することがわかっているコマンドを実行して問題を stderr に書き込んでも、以下のチェックは登録されません。このコードの何が間違っている可能性がありますか?
助けてくれてありがとう。
perl - 子プロセスに対してelseブロックが実行されるのはなぜですか?
forkとwaitpidを使用したプログラムを次に示します。
出力は次のようになります。
fork現在、ウェブや本に関する多くの同様のプログラムがあり、それは言う
if ブロック内のコードは親プロセスによって実行され、else 内のコードは子プロセスによって実行されます。また、waitpid は、childs が終了するのを待つために使用されます。
私の質問は
子プロセスに対してelseブロックが実行される方法と理由は? フォークが新しい子プロセスを作成したことがわかりました。しかし、fork ステートメントの後で子 (else ブロック) の実行はどのように行われるのでしょうか? 誰かが子プロセスについてこのステップバイステップで説明してくれますか、または子が以下のステートメントを実行しない理由のように、私が見逃しているものについてより多くの洞察を得ることができますか?
c - バックグラウンドでプロセスを実行するためにwaitpidを使用していますか?
コマンドの最後に「&」が見つかった場合、バックグラウンドでプロセスを実行するbash機能を模倣しようとしています。私は次の機能を持っています...そして、私がやりたいことをしているとは思いません
「ls -l」を実行するだけで期待どおりに動作します..しかし、バックグラウンドで ls を実行し、プログラムに新しいコマンドを受け入れさせ続ける場合は、バックグラウンド フラグを 1 に設定して関数を呼び出します。プロセスをバックグラウンドで実行し、プロセスが作成されたことを伝えてから、次のコマンドを受け入れるように求めます。