pause () / kill () родительский / дочерний процесс. Родитель продолжает получать SIGTERM от ребенка после первого SIGTERM - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь создать дочерний процесс, который посылает сигнал родителю, когда он готов (после выполнения какой-либо задачи).Когда сигнал отправляется, родитель не делает паузу и выполняет некоторую работу, а затем снова делает паузу, ожидая, пока ребенок снова не будет готов.Ребенок после отправки сигнала блокирует и ждет моего ввода, прежде чем отправить другой сигнал родительскому процессу.

Я хочу, чтобы это повторялось произвольное количество раз.Ниже мой подход:

void sig_handler(int sig){
        if (sig == SIGTERM) printf("Working team is ready!\n");
        return;
}

int main(){
        //signal(SIGTERM,sig_handler);
        char*** orders;
        int NumOrders;
        if ((orders = importFileToArray(&NumOrders)) != NULL){
                SDFSort(orders, NumOrders);
                int i,j;
                for (i=0;i<NumOrders;i++){
                        for (j=0;j<4;j++){
                                printf("%s ", orders[i][j]);
                        }
                        printf("\n");
                }

                pid_t pid, ppid = getpid();

                if ((pid = fork()) == 0){
                        int choice = 1;
                        while(1){
                                sleep(1);
                                kill(getppid(),SIGTERM);
                                //do some work
                                scanf("%d", &choice);
                        }
                }else{
                        while(1){
                                signal(SIGTERM,sig_handler);
                                pause();
                                //do some work
                        }
                        wait(NULL);
                }

        }
}

Ниже вывод:

Working team is ready!
a
Working team is ready!
Working team is ready!
Working team is ready!
Working team is ready!
Working team is ready!
a
Working team is ready!
Working team is ready!
a
Working team is ready!
Working team is ready!
Working team is ready!
Working team is ready!
^C

Как вы можете видеть, это работает хорошо с первого раза (родительский блок. Ребенок посылает сигнал ссообщение «Рабочая группа готова» и родительский блок разблокируется. Но тогда вместо блокировки на scanf кажется, что ребенок продолжает посылать сигналы родителю, игнорируя мой ввод. Что я делаю неправильно?

...