web-dev-qa-db-ja.com

Cで子PIDを取得する方法

for- loopで子プロセスを作成しています。子プロセス内では、getpid()を使用して子PIDを取得できます。

ただし、何らかの理由でgetpid()の値を親プロセスで宣言された変数に格納しようとすると、親プロセスでチェックすると、変更が無効になります。これはある種のプロセス変数スコープと関係があると思います。 Cにはあまり慣れていないので、確信が持てません。

とにかく、子PID(子プロセスから呼び出されたとき)のgetpid()の結果を親プロセスの変数に格納する方法は何ですか?

または、別の方法として、fork()を親の変数に格納し、その変数で関数を呼び出して子のPIDを取得することもできますか?私もこれを行う方法がわからないので、これがより良い方法である場合、どのようにこれを行いますか?

16
Derek

forkはすでに子のpidを返します。戻り値を格納するだけです。

man 2フォークを見てください。

戻り値

 Upon successful completion, fork() returns a value of 0 to the child process and
 returns the process ID of the child process to the parent process.  Otherwise, a
 value of -1 is returned to the parent process, no child process is created, and
 the global variable errno is set to indicate the error.
31
MByD

以前の回答で述べたように、「fork()は値0を子プロセスに返し、子プロセスのプロセスIDを親プロセスに返します。」したがって、コードは次のように書くことができます:

pid = fork(); /* call fork() from parent process*/
if (0 == pid)
{
  /* fork returned 0. This part will be executed by child process*/
  /*  getpid() will give child process id here */
}
else
{
  /* fork returned child pid which is non zero. This part will be executed by parent process*/
  /*  getpid() will give parent process id here */
} 

これは link は非常に役立ち、詳細に説明しています。

5
Amal Roshan

fork()が正常に作成された場合、子プロセスで値0を返します。

int main(void)
{
    int id;
    id= fork();
    if(id==0)
    {
        printf("I am child process my ID is   =  %d\n" , getpid());
    }
}

次の方法でforkを呼び出す場合:

pid = fork()

次に、pidは実際にはあなたの子供のPIDです。だから、親からそれを印刷することができます。

1
Papbad