使用信号

时间:2017-06-24 10:53:29

标签: c process signals ipc scheduling

我接受了这个特殊的任务:

  

使用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。关于如何实现目标的任何想法?

0 个答案:

没有答案