Что не так с отправкой сигнала после форка в приведенном ниже коде - PullRequest
0 голосов
/ 05 мая 2019

я написал следующий код: после функции fork () родитель отправляет сигнал потомку.Я думаю, что ребенок получает сигнал и заканчивается.Я не хочу решения, потому что я могу решить его двумя нижеуказанными способами.я хочу знать, что является причиной этой проблемы?

то, что я попробовал сначала, ниже кода:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <wait.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>

#define maxchild 1

int inchild=-1;

void sighandler(int signo){
    char buffer[256];
    int a,b=0;
    switch(signo){
    case SIGUSR1:
        printf("SIGUSR1\n");
        break;
    case SIGUSR2:
        printf("SIGUSR2\n");
        break;
}
}


int main(){
pid_t ids[maxchild];
struct sigaction control;
control.sa_flags=0;
control.sa_handler=sighandler;
sigemptyset(&control.sa_mask);
sigaction(SIGUSR1,&control,NULL);
sigaction(SIGUSR2,&control,NULL);
for(int i=0;i<maxchild;i++){
    ids[i]=fork();
    printf("here %d\n",ids[i]);
    if(ids[i]==0){
        printf("in child\n");
        inchild=i+1;
        break;
    }
}
while(inchild>=0) {
}
//  sleep(1);
if(inchild==-1){
    for(int i=0;i<maxchild;i++){
        printf("child: %d\n parent: %d\n",ids[i],getpid());
        kill(ids[i],SIGUSR1);
    }

}
  if (inchild==-1) wait(NULL);
    return 0;
}

когда я запускаю код столько раз, я ожидаю увидеть«SIGUSR1» выводится каждый раз, но чаще всего вывод:

here 17573 (or any other positive number)
child: 17573
parent: 17572

, а затем программа внезапно завершается.я понимаю, что могу решить это двумя способами: 1. родительский сон спит после функции fork ():

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <wait.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>

#define maxchild 1

int inchild=-1;

void sighandler(int signo){
    char buffer[256];
    int a,b=0;
    switch(signo){
    case SIGUSR1:
        printf("SIGUSR1\n");
        break;
    case SIGUSR2:
        printf("SIGUSR2\n");
        break;
}
}


int main(){
pid_t ids[maxchild];
struct sigaction control;
control.sa_flags=0;
control.sa_handler=sighandler;
sigemptyset(&control.sa_mask);
sigaction(SIGUSR1,&control,NULL);
sigaction(SIGUSR2,&control,NULL);
for(int i=0;i<maxchild;i++){
    ids[i]=fork();
    printf("here %d\n",ids[i]);
    if(ids[i]==0){
        printf("in child\n");
        inchild=i+1;
        break;
    }
}
while(inchild>=0) {
}
    sleep(1);
if(inchild==-1){
    for(int i=0;i<maxchild;i++){
        printf("child: %d\n parent: %d\n",ids[i],getpid());
        kill(ids[i],SIGUSR1);
    }

}
  if (inchild==-1) wait(NULL);
    return 0;
}

что он будет работать нормально

Я также могу прокомментировать строку «kill (...)», чтобы решить проблему:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <wait.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>

#define maxchild 1

int inchild=-1;

void sighandler(int signo){
char buffer[256];
int a,b=0;
switch(signo){
case SIGUSR1:
    printf("SIGUSR1\n");
    break;
case SIGUSR2:
    printf("SIGUSR2\n");
    break;
}
}


int main(){
pid_t ids[maxchild];
struct sigaction control;
control.sa_flags=0;
control.sa_handler=sighandler;
sigemptyset(&control.sa_mask);
sigaction(SIGUSR1,&control,NULL);
sigaction(SIGUSR2,&control,NULL);
for(int i=0;i<maxchild;i++){
    ids[i]=fork();
    printf("here %d\n",ids[i]);
    if(ids[i]==0){
        printf("in child\n");
        inchild=i+1;
        break;
    }
}
while(inchild>=0) {
}
 //      sleep(1);
if(inchild==-1){
    for(int i=0;i<maxchild;i++){
        printf("child: %d\n parent: %d\n",ids[i],getpid());
    //  kill(ids[i],SIGUSR1);
    }

}
  if (inchild==-1) wait(NULL);
    return 0;
}

Теперь я хочу узнать причину проблемы.

я хочу запустить первый код и посмотреть: здесь (положительное число) здесь 0 в дочернем дочернем: (положительное число) родитель: (положительное число) SIGUSR1 и программа должна продолжаться, пока я не нажмуCtrl + C (конечно, порядок строк в выводе не имеет значения)

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

1 Ответ

1 голос
/ 06 мая 2019

Если в процессе установлен обработчик сигнала, он вызывается при получении сигнала. Этот процесс еще не закончен. Так что все дети застряли в

  while (inchild >= 0) {
  } 

Поскольку дочерний элемент не заканчивается, родитель блокирует wait().

Чтобы исправить это, замените приведенный выше фрагмент на

  if (inchild >= 0) {
    pause();
  }
...