-2

私はオペレーティング システムに関する本を読んでおり、C プログラミングもかなり新しいものです (物事を複雑にする傾向があります) が、fork() を介してすべての子が作成されたときに、増分された i 値を出力できない理由に興味があります。それは子プロセスまたは何か他のものにありますか? 前もって感謝します。

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

int main ()
{
    pid_t pid;
    int i = 1;

    pid = fork();
    pid = fork();
    pid = fork();
    pid = fork();

    if (pid == 0) {
        printf("got child %d\n", i);
        i++;
    }
}
4

4 に答える 4

2

親と子のプロセス ID にはgetpid()andを使用します。getppid()

例はこちら

int main()
{

        int i;
        printf("hello before fork \n");
        printf("i : %d\n",i);

        i=fork();
        printf("\n");

        if(i==0)
        {

                printf("Child has started\n\n");
                printf("child printing first time \n");

                printf("getpid : %d getppid : %d \n",getpid(),getppid());
                sleep(5);
                printf("\nchild printing second time \n");
                printf("getpid : %d getppid : %d \n",getpid(),getppid());
        }
        else
        {
                printf("parent has started\n");
                printf("getpid : %d  getppid : %d \n",getpid(),getppid());
                printf("\n");

        }

        printf("Hi after fork i : %d\n",i);

        return 0;


}

出力:

[04mca8@LINTEL pp]$ ./a.out hello before fork i : 134514088

子供が始めました

子の印刷が初めて getpid : 8354 getppid : 8353

親が getpid を開始しました: 8353 getppid: 5656

Hi after fork i : 8354 [04mca8@LINTEL pp]$ child printing second time getpid : 8354 getppid : 1 Hi after fork i : 0

于 2012-09-17T14:52:50.313 に答える
1

i各親/子にはメモリ用の個別のスタックがあるため、それぞれが設定されている独自のバージョンを取得します。したがって、printfは 1 つ、つまり 16 個を出力するだけです。

とを使用getpidgetppidます。

于 2012-09-17T14:54:28.903 に答える
1

あなたのコードはまったく意味がありません。

  1. を呼び出すたびfork()に、その時点で新しいプロセスが作成されます。
  2. 2 つのプロセスはそれぞれ、 の後の時点で実行を継続しfork()ます。
  3. これは、2 番目のプロセスが2 つのプロセスfork()によって呼び出されることを意味します。元のものと最初の によって作成された子。fork()
  4. 等々。
  5. 何度も上書きpidしてから、0 をチェックします。
  6. iではなくを印刷し、印刷pidにインクリメントしますが、効果はありません。

これらのことをさらに調べてください。あなたはやや混乱しているようです。

于 2012-09-17T14:55:29.217 に答える
1

はインクリメントされた後に印刷されていないため、インクリメントされた値を印刷することはできませんi。によってスピンオフされたプロセスはfork()リソースを共有せず、それぞれが の独立したコピーを取得しますi。したがって、次のことがわかります。

got child 1

何度も。この微調整を試すと、各子プロセスが同じ値で条件付きになっていることがわかります。

int main () {
  pid_t pid;
  int i = 1;
  pid = fork();
  pid = fork();
  pid = fork();
  pid = fork();
  if (pid == 0) {
     printf("the child %d, got %d\n", getpid(), i);
     i++;
  }
}
于 2012-09-17T14:53:24.093 に答える