1

このプログラムでは、execvを使用して別のプロセスを開始します。

if (fork() == 0) {
    struct rlimit limits;
    limits.rlim_cur = 10000000; // set data segment limit to 10MB
    limits.rlim_max = 10000000; // make sure the child can't increase it again
    setrlimit(RLIMIT_DATA, &limits);
    execv(...);
}

開始されたプログラムのpidを取得するにはどうすればよいですか?

4

5 に答える 5

3

親の呼び出しによって返されるため、の戻り値を変数fork()に取り込む必要があります。fork()

pid_t child_pid = fork();
if (child_pid == -1) {
  // fork failed; check errno
}
else if (child_pid == 0) {  // in child
  // ...
  execv(...);
}
else {  // in parent
  // ...
  int child_status;
  waitpid(child_pid, &child_status, 0);  // or whatever
}

子供では、の使用execv()は無関係です。それはpidを変更しません。

于 2011-04-27T04:07:13.557 に答える
2

これが元のプロセスのfork()からの戻り値です...

于 2011-04-27T04:05:47.693 に答える
1
pid_t child;
child = fork();
if (child == 0) {
于 2011-04-27T04:07:45.040 に答える
1

ねえ、私はそのコードスニペットを認識しています。

あなたの前の質問に対する私の答えは、とと組み合わせて使用​​する方法のでした。これは完全な例として意図されたものではなく、通常は後で使用するためにの戻り値を保存します(これは、ここで必要な子のpidであるため)。setrlimit()fork()exec()fork()

サンプルコードは必ずしも完全なコードではありません。

于 2011-04-27T04:09:34.187 に答える
1

必要なのは、pidこのプログラムを開始しているプロセスです。

fork関数のシグネチャは次のとおりです。

#include <unistd.h>

pid_t fork(void);

そしてそれは戻ります:

  • 0子供の中で
  • the pid of the child親で
  • -1エラーが発生した場合

新しいプロセス(子)を作成する場合pidは、戻り値が。より大きいかどうかを確認する必要があります0

あなたの例では:

pid_t pid = fork()

if (pid == 0) {
    struct rlimit limits;
    limits.rlim_cur = 10000000; // set data segment limit to 10MB
    limits.rlim_max = 10000000; // make sure the child can't increase it again
    setrlimit(RLIMIT_DATA, &limits);
    execv(...);
}
else if (pid > 0) {
    /* That's the value of the pid you are looking for */
}

これは紛らわしいかもしれませんが、fork()実行されると子プロセスが作成されるため、プログラムは2つに分割されます。そのため、pid値を確認し、子または親のどちらにいるかに応じて、必要な処理を実行する必要があります。

于 2011-04-27T04:10:24.733 に答える