fork()返回的数字大于0

时间:2018-06-25 23:02:58

标签: c unix fork

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
// Curtis    
void kloop(int x)
{
    int breakCondition;
    breakCondition = 0;
    while(1)
    {
            printf("Process %d running\n", x);
            sleep(1);

            breakCondition = breakCondition + 1;
            if (breakCondition == 5)
            {
                    break;
            }
    }
}

// ---------------

void makeChild()
{
    int status;
    pid_t pid;
    pid = fork();

    printf("fork number %d\n", pid);
    printf("processid: %d", getpid());

    if (pid < 0)
    {
            printf("You done messed up.\n");
    }
    else if (pid == 0)
    {
            printf("You are in child process %d\n", getpid());
    }
    else
    {
            printf("You ain't no kid.\n");
    }

    printf("fork number after if/else:  %d\n", pid);
    printf("processid after if/else:  %d\n", getpid());
}

// ---------------

int main()
{
    int status;
    int n;
    printf("How many child processes do you want to create?\n");
    scanf("%d", &n);

    printf("\n");

    kloop(n);

    int i;
    for (i=0;i<n;i++)
    {
            //printf("\t'i' at %d", i);
            makeChild();
    }
    return 0;
}

这是一个.c文件,我正在使用gcc和./a.out在终端中运行它。 当我以前使用过fork时,通常给我的值等于或小于0。 在这种情况下,它看起来像一个processid。

以下是输出示例:

您要创建几个子进程?

1

进程1正在运行

进程1正在运行

进程1正在运行

进程1正在运行

进程1正在运行

货叉号10572

进程ID:10566您不是孩子。

if / else之后的叉号:10572

if / else之后的processid:10566

叉号0

进程ID:10572您处于10572子进程中

if / else之后的叉号:0

if / else之后的processid:10572

1 个答案:

答案 0 :(得分:0)

使用fork的基本模式是这样。

void makeChild() {
    pid_t pid = fork();

    // Error
    if (pid < 0) {
        fprintf(stderr, "fork() failed: %s\n", strerror(errno));
    }
    // Child
    else if (pid == 0) {
        printf("Child, pid %d, ppid %d\n", getpid(), getppid());

        doSomething();

        // This is the important piece, the child branch must exit.
        exit(0);
    }
    // Parent
    else {
        printf("Parent, pid %d. Child pid is %d\n", getpid(), pid);
    }
}

父级和子级在fork之后继续处理。唯一的区别是父母和孩子得到什么。孩子收到0,父母收到孩子的pid。

$ ./test
Parent, pid 35324. Child pid is 35325
Child, pid 35325, ppid 35324

关键的是,一旦孩子完成了所要做的一切, 孩子分支必须退出 ,否则它将继续并运行其余代码。

>