使用fork()的子进程和父进程

时间:2014-10-11 05:18:39

标签: c++ c operating-system fork

我遇到问题,我需要制作一个制作9个子进程的程序,之后我必须进行3秒的倒计时并使这9个进程等待来自父亲的信号,之后收到这个信号后,每个孩子都应该说出他是什么孩子(如果他是孩子#1,#2,#3等......,按照他们的顺序)。

我所做的就是在这里,一切都很好,我想,直到我作为一个孩子要说的部分,我的号码是什么,我不知道如何做到这一点,因为每个孩子都是一个不同的过程,他们不共享记忆,信号不能使用参数,现在我在名为" handler&#的函数上打印PID。 34;,但我如何打印我的号码,作为一个孩子?。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

void handler(int x);

int main() {    
    pid_t child[9];
    pid_t child_pid;

    for (int i = 0; i < 9; ++i) {
        child_pid = fork();
        child[i] = child_pid;

        if (child_pid == 0)
            break;

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

    if (child_pid == 0) {
        signal(SIGUSR1, handler);
        pause();
    } else {
        printf("Countdown:\n");
        sleep(1);
        printf("3\n");
        sleep(1);
        printf("2\n");
        sleep(1);
        printf("1\n");
        sleep(1);

        for (int i = 0; i < 9; i++)
            kill(child[i], SIGUSR1); 

        waitpid(-1, NULL, 0);
    }

    return 0;
}

void handler(int sig) {
    printf("This is Child #%d\n", getpid());

    exit(0);
}

1 个答案:

答案 0 :(得分:1)

创建一个全局变量:

int my_number;

然后在创建子项的循环中,执行:

    if (child_pid == 0) {
        my_number = i;
        break;
    }

然后你可以在处理程序中使用变量:

void handler(int sig) {
    printf("This is Child #%d\n", my_number);

    exit(0);
}