Я довольно много работал над оболочкой, и теперь я пытаюсь обновить этот код, чтобы он сообщал, когда дочерний элемент был прерван сигналом (кроме SIGINT).
Я также пытаюсь сообщить о "дампе ядра", если это произошло в скобках (аналогично bash).
...
if(test == -1){
cpid = fork();
if(cpid < 0){
//Fork wasn't successful
perror("fork");
free(argList);
return -1;
}
if(cpid == 0){
//We are the child!
close(pipefd[0]);
dup2(pipefd[1], 1);
execvp(args[0], args);
//execvp returned, wasn't successful
perror("exec");
fclose(stdin);
exit(127);
}
close(pipefd[1]);
//Have the parent wait for child to complete, if flags allow
if(strcmp(flags, "NOWAIT") != 0){
if(wait (&status) < 0){
//Wait wasn't successful
perror("wait");
}
else{
////////////////////////////////////////////////////////
//report if a child has been terminated by a signal other than SIGINT
if((WIFSTOPPED(status) && (WSTOPSIG(status) != SIGINT))){
printf("child terminated by signal [%d]\n", WSTOPSIG(status));
if(WCOREDUMP(status)){
printf("core dumped\n");
}
}
//////////////////////////////////////////////////////////
free(argList);
//since no child is running, return 0
return 0;
}
}
else{
//if a child is running, return the child's pid
return cpid;
}
}
...
Я не совсем уверен, как поступить с этим. Я впервые много работаю с командой fork (), и мои знания об отношениях между родителями и ребенком довольно скудны, если честно. Я искал ответы, и самое близкое, что я получил, это то, что SIGCHLD обрабатывает подобные вещи, но мне нужно иметь возможность распечатать конкретное число. что-то вроде:
printf("child terminated (%d)\n", 15 + signal);
редактировать *
Я помещаю то, что я считаю правильной реализацией того, что я хочу, в код, окруженный ////////