1

ブロックされてから終了するプロセスを作成するコードに取り組んでいます.psでブロックされた状態を確認できる必要があります.

私はこれで試しましたが、私のCの知識は良くありません。コードは何も出力しません。

ここにあります:

#include <stdio.h>
#include <stdlib.h> //exit();
#include <unistd.h> //sleep();

int main(int argc, char *argv[]) {
    createblocked();
}

int pid;
int i;
int estado;

void createblocked() {
   pid = fork();

   switch( pid ) {
      case -1: // pid -1 error ocurred
         perror("error\n");
      break;
      case 0: // pid 0 means its the child process
         sleep(); // we put the child to sleep so the parent will be blocked.
         printf("child sleeping...");
      break;
      default: // !=0 parent process
         // wait function puts parent to wait for the child
         // the child is sleeping so the parent will be blocked 
         wait( estado );
         printf("parent waiting...\n");
         printf("Child terminated.\n");
         break;
   }
   exit(0);
}

ブロックされるのは小さなプログラムだけなので簡単なはずですが、私は円を描いて歩いていると思います。何かアドバイス?

4

2 に答える 2

3

sleep()はパラメーターを取ります: スリープする秒数です。省略するとすぐに戻ってしまう傾向があります。

また、 wait()int *ではなくを受け取りますint

これを試して:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    createblocked();
}

int pid;
int i;
int estado;

void createblocked() {
    pid = fork();

    switch(pid)
    {
        case -1: // pid -1 error ocurred
            perror("error\n");
            break;
        case 0: // pid 0 means its the child process
            printf("child sleeping...\n");
            sleep(500); // we put the child to sleep so the parent will be blocked.
            break;
        default: // !=0 parent process
            // wait function puts parent to wait for the child
            // thechild is sleeping so the parent will be blocked 
            printf("parent waiting...\n");
            wait(&estado);
            printf("Child terminated.\n");
            break;

    }
    exit(0);
}

注:printf("parent waiting...\n") 上記の呼び出しも に移動したwait()ため、親ブロックが子を待機する前に表示されるはずです。

編集:また、含めます<unistd.h>。プログラムが (ほとんどのシステムで) 動作するために厳密に必要というわけではありませんが、そうすることで、関数の引数の欠落や型の誤りなどのコンパイル時のエラー報告が改善されます。

于 2012-12-02T17:27:31.683 に答える
1

睡眠

は待つ

の引数として秒数を指定する必要がありますsleep()

waitおよびsleep含む_<unistd.h>

于 2012-12-02T17:24:11.223 に答える