C:父子进程

时间:2016-03-02 00:46:17

标签: c process fork parent child-process

我正在尝试做以下事情......

Create a new process
obtain the PID of a process
put a process to sleep for a defined period of time
check process ID on the terminal 

我的程序运行,但输出不是我所期望的那样,我不太确定我哪里出错了。谢谢你的时间,我真的很感激!

代码:

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

    /** use fork() system call to create a new process */
    /** if the pid returned by fork() is negative, it indicates an error */

    if(fork()<0) {
        perror("fork");
        exit(1);
    }

    if(pid==0) {
        printf("child PID= %d\n", (int) getpid());
        for(i=0; i<10; i++) {
            printf("child: %d\n", i);
            /** put process to sleep for 1 sec */
            sleep(1);
        }
    } else {
        /* parent */
        /** print the parent PID */
        printf("parent PID= %d\n", (int) getpid());
        for(i=0; i<10; i++) {
            printf("parent: %d\n", i);
            sleep(1);
        }
    }

    exit(0);
}

输出应该看起来像......

parent PID=8900
child PID=4320
parent:0
child:0
child:1
parent:1
child:2
parent:2
child:3
parent:3
parent:4
etc.

但我得到......

child PID= 97704
child: 0
child PID= 106388
child: 0
child: 1
child: 1
child: 2
child: 2
child: 3
child: 3
child: 4
child: 4
child: 5
child: 5
child: 6
child: 6
child: 7
child: 7

3 个答案:

答案 0 :(得分:2)

你没有真正将fork()的输出分配给pid,所以pid保持为零。

答案 1 :(得分:1)

如上所述,您不会将pid分配给任何内容,因此它始终为零。您还应将条件更改为pid,而不是调用另一个fork()

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

pid = fork(); /* Add this */

/** use fork() system call to create a new process */
/** if the pid returned by fork() is negative, it indicates an error */

if(pid<0) { /* Change this */
    perror("fork");
    exit(1);
}

另外,如果您的预期输出看起来仍然与您期望的不同,请不要感到惊讶。没有办法告诉孩子或父母什么时候被打电话(特别是如果你睡了)。这取决于各种各样的事情。

编辑:我明白你在说什么。您想通过终端检查进程ID吗?您可以在程序结尾添加getchar();以暂停程序退出,然后您可以打开另一个终端并运行ps。您需要确保添加#include <stdio.h>,以便使用它。

答案 2 :(得分:0)

使用pid进行比较,而不是调用另一个fork()。设置pid等于fork(),以便您可以对其进行比较以检查pid中的错误。

int main() {
    int i;
    pid_t pid=0;
    pid = fork();

    /** use fork() system call to create a new process */
    /** if the pid returned by fork() is negative, it indicates an error */

    if(pid<0) {
        perror("fork");
        exit(1);
    }

    if(pid==0) {
        printf("child PID= %d\n", (int) getpid());
        for(i=0; i<10; i++) {
            printf("child: %d\n", i);
           /** put process to sleep for 1 sec */
            sleep(1);
        }
    } else {
       /* parent */
        /** print the parent PID */
        printf("parent PID= %d\n", (int) getpid());
        for(i=0; i<10; i++) {
            printf("parent: %d\n", i);
            sleep(1);
       }
    }

    exit(0);
}