我接受了这个特殊的任务:
使用SIGCONT,SIGSTOP和SIGCHLD编写一个接受的程序 通过argv []命令列表(它们都没有参数)和 以循环方式运行命令,交替执行命令 每隔1秒钟。
为实现这一目标,我尝试了这个:
int dead_children = 0;
int nr_processes;
void inc_dead () {
printf("I, %d, died\n", getpid());
dead_children++;
if (dead_children == nr_processes)
_exit(0);
}
int main (int argc, char *argv[]) {
int pids[argc - 1];
nr_processes = argc - 1;
signal(SIGCHLD, inc_dead);
for (int i = 1; i < argc; i++) {
pid_t pid;
if ( (pid = fork()) == -1 ) {
perror("fork");
return EXIT_FAILURE;
}
if ( !pid ) {
pause();
execlp(argv[i], argv[i], (char *) NULL);
perror("exec");
_exit(1);
}
pids[i - 1] = pid;
}
while (dead_children < nr_processes)
for (int j = 0; j < argc - 1; j++) {
kill(pids[j], SIGCONT);
sleep(1);
kill(pids[j], SIGSTOP);
}
return EXIT_SUCCESS;
}
我尝试使用非常简单的程序运行此代码,以便验证任务的正确性:
int main (void) {
int i = 5;
while (i-- > 0) {
printf("This is %d saying HI!\n", getpid());
sleep(1);
}
return EXIT_SUCCESS;
}
然而,这不起作用。我注意到,在创建之后,子进程从未离开pause()
指令,即使父进程发送了SIGCONT
。关于如何实现目标的任何想法?