C 将创建多少个进程

C 将创建多少个进程,c,linux,unix,fork,posix,C,Linux,Unix,Fork,Posix,我有这段代码,想知道将创建多少个进程。我不确定,因为我认为这将是12个过程,但也可能是8个循环 包括 包括 int main{ pid_t childpid; int i; childpid=fork; 对于i=0;i

我有这段代码,想知道将创建多少个进程。我不确定,因为我认为这将是12个过程,但也可能是8个循环

包括 包括 int main{ pid_t childpid; int i; childpid=fork; 对于i=0;i<3&&childpid==0;i++{ 如果childpid==-1{ 佩罗尔没有分叉。; 返回1; } fprintfstderr,A\n; childpid=fork; 如果childpid==0{ fprintfstderr,B\n; childpid=fork; fprintfstderr,C\n; } } 返回0; } 以下是第一次循环后的情况:


是的,您可以使用“能力倾向”来评估创建了多少个流程,但我让程序为我决定

使用信号量同步子进程和父进程,并使用pcount变量跟踪已创建进程的数量。每当childpid求值为零时,pcount将递增。下面是对您的程序的补充

#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

int main(void)
{
    /* Initialize and setup a semaphore */

    sem_t* sema = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    if (sema == MAP_FAILED)
        exit(1);

    if (sem_init(sema, 1, 1) != 0)
        exit(1);

    /* Initialize pcount */

    int* pcount = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    if (pcount == MAP_FAILED)
        exit(1);

    *pcount = 1;

    printf("pcount = %d\n", *pcount);

    pid_t childpid;
    int i;

    childpid = fork();

    if (childpid == 0) {
        sem_wait(sema);
        *pcount = *pcount + 1;
        printf("pcount = %d\n", *pcount);
        sem_post(sema);
    }

    for (i = 0; i < 3 && childpid == 0; i++) {

        if (childpid == -1) {
            perror("Failed to fork.");
            return 1;
        }

        fprintf(stderr, "A\n");

        childpid = fork();

        if (childpid == 0) {

            sem_wait(sema);
            *pcount = *pcount + 1;
            printf("pcount = %d\n", *pcount);
            sem_post(sema);

            fprintf(stderr, "B\n");
            childpid = fork();

            if (childpid == 0) {
                sem_wait(sema);
                *pcount = *pcount + 1;
                printf("pcount = %d\n", *pcount);
                sem_post(sema);
            }

            fprintf(stderr, "C\n");
        }
    }

    return 0;
}

是的,答案是8。简单的豌豆:

为什么你认为它可以是8?
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

int main(void)
{
    /* Initialize and setup a semaphore */

    sem_t* sema = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    if (sema == MAP_FAILED)
        exit(1);

    if (sem_init(sema, 1, 1) != 0)
        exit(1);

    /* Initialize pcount */

    int* pcount = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    if (pcount == MAP_FAILED)
        exit(1);

    *pcount = 1;

    printf("pcount = %d\n", *pcount);

    pid_t childpid;
    int i;

    childpid = fork();

    if (childpid == 0) {
        sem_wait(sema);
        *pcount = *pcount + 1;
        printf("pcount = %d\n", *pcount);
        sem_post(sema);
    }

    for (i = 0; i < 3 && childpid == 0; i++) {

        if (childpid == -1) {
            perror("Failed to fork.");
            return 1;
        }

        fprintf(stderr, "A\n");

        childpid = fork();

        if (childpid == 0) {

            sem_wait(sema);
            *pcount = *pcount + 1;
            printf("pcount = %d\n", *pcount);
            sem_post(sema);

            fprintf(stderr, "B\n");
            childpid = fork();

            if (childpid == 0) {
                sem_wait(sema);
                *pcount = *pcount + 1;
                printf("pcount = %d\n", *pcount);
                sem_post(sema);
            }

            fprintf(stderr, "C\n");
        }
    }

    return 0;
}
$ gcc SO.c -lpthread 
$ ./a.out
pcount = 1
pcount = 2
A
pcount = 3
B
C
pcount = 4
C
A
pcount = 5
B
C
pcount = 6
C
A
pcount = 7
B
C
pcount = 8
C