0

これが私のコードで、このプログラムを実行するために実行します./2c 10 5— 引数 1 に 10、引数 2 に 5 です。プログラムは 10 個の子プロセスを実行し、5 番目の子プロセスが別の子プロセスを作成しますが、この場合、私の ppid は常に同じです。それは決して変わらない。すべての子供に同じ ppid を与えました

私が得る出力は次のとおりです。

pid: 1 ppid: 6
pid: 2 ppid: 6
pid: 3 ppid: 6
pid: 4 ppid: 6
pid: 5 ppid: 6``
ピッド: 6 ピッド: 6
pid: 7 ppid: 6
pid: 8 ppid: 6
pid: 9 ppid: 6
pid: 10 ppid: 6
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[],char *envp[])
{
  int i,a;

  a=getpid();
  int pid;
  int child,child2;
  child=atoi(argv[1]);
  child2=atoi(argv[2]);

  if(atoi(argv[2])>atoi(argv[1]))
  {
    printf("arg2 is bigger than arg1!");
    exit(1);
  }

  for(i=1;i<=child;i++)
  {
    pid=fork();
    if(i=child2 && pid==0)
    {
      pid=fork();
      break;
    }
    if(pid==0)
      break;
  }

  if(getpid()!=a)
    if(getppid()==a)
    {
      printf("PID: %d   PPID: %d\n",getpid(),getppid());

      sleep(5);
      exit(0);
    }

  for(i=1;i<=child+1;i++)
    wait(0);

  return 0; 
}

これは私のコードです。誰かがこれをテストして、このサイトで出力を送信できます...比較できます..コンパイルするには、gcc test.c -o test を使用し、./test 10 5 を実行します...

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[], char *envp[])
{
int i,a;
a=getpid();
pid_t pid;
int child,child2;
child=atoi(argv[1]);
child2=atoi(argv[2]);

if(atoi(argv[2])>atoi(argv[1]))
{
    printf("2nd argumentet is bigger than 1st");
    exit(1);
}
for(i=1;i<=child;i++)
{
    pid=fork();
    if(i==child2 && pid==0)
    {
        pid=fork();
        break;
    }
if(pid==0)
    break;
}
if(getpid()!=child2)
{
    printf("PID: %d  PPID: %d\n",getpid(),getppid());
    sleep(5);   
    exit(0);
}
for(i=0;i<=child+1;i++)
wait(0);
return 0;

}

4

1 に答える 1

2

あなたのコードは、あなたが主張していることを示していません。次の行で子を明確にチェックするため、子からの出力のみを印刷し、孫からの出力は印刷しません。

if(getppid()==a)

その行でa、プログラムの元のインスタンスの pid を保持します。を呼び出すとfork、割り当てられた行をすでに通過しているため、それは変わりませんa。すべての直接の子の親 pid は常に同じです。それがの意味だからです。

上で強調表示した行を削除すると、期待した結果が表示されるはずです。

于 2012-09-05T14:11:15.190 に答える