【问题标题】:Child and Parent process with fork()使用 fork() 的子进程和父进程
【发布时间】:2014-12-06 07:54:01
【问题描述】:

我遇到了问题,我需要制作一个程序,生成 9 个子进程,然后我必须倒计时 3 秒,让这 9 个进程在收到这个信号后等待父亲的信号信号,每个孩子都应该说出他是什么孩子(如果他是孩子#1、#2、#3,等等……,按照他们被创造的顺序)。

我所做的是在这里,一切都很好,我想,直到我不得不说作为一个孩子的部分,我的号码是多少,我不知道该怎么做,因为每个孩子是一个不同的过程,它们不共享内存,并且信号不能为此使用参数,现在我在名为“处理程序”的函数上打印 PID,但是作为孩子,我如何打印我的号码? .

#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);
}

【问题讨论】:

  • 孩子拥有父母记忆的副本。所以它可以访问循环变量i来获取它的编号。
  • @MikeW 这似乎是那个问题的重复,但那里的答案从来没有真正说明如何解决这个问题。
  • 但我只是注意到它们都是由同一个用户发布的。你为什么隔一个小时发布同样的问题?
  • 因为我犯了一个错误,我在那个问题上表达得很糟糕,因此回答的人没有帮助我。

标签: c++ c operating-system fork


【解决方案1】:

创建一个全局变量:

int my_number;

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

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

然后就可以在handler中使用变量了:

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

    exit(0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多