【发布时间】: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