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().

对于waitsleep包括<unistd.h>

于 2012-12-02T17:24:11.223 回答