У меня есть основная программа, которая запускает программу из аргументов командной строки. Программа командной строки разветвляется и запускается в дочернем процессе. Когда SIGINT отправляется, я хочу поймать его и попросить пользователя подтвердить, что он / она хочет выйти. Если да, и родитель, и дочерний процесс заканчиваются, иначе дочерний процесс продолжает работать. Моя проблема в том, что я не могу заставить ребенка начать резервное копирование, когда пользователь говорит «нет». Я пробовал SIGSTOP и SIGCONT, но на самом деле они просто останавливают процессы.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
extern char **environ;
void sigint_handler(int sig);
void sigint_chldhandler(int sig);
int main( int argc, char** argv)
{
int pid;
signal(SIGINT,sigint_handler);
if((pid=fork())==0)
{
printf("%d\n",pid);
execve(argv[1],argv,environ);
}
int status;
waitpid(pid,&status,0);
}
void sigint_handler(int sig)
{
printf("Do you want to quit?Yes/No:\n");
char buf[4];
fgets(buf, sizeof(char)*4, stdin);
printf("child pid:%d\n",getpid());
printf("parent pid:%d\n",getppid());
if(strcmp(buf,"Yes")==0)
{
kill(-getpid(),SIGKILL);
printf("Exiting!\n");
exit(0);
}
}
signal(SIGINT, SIG_IGN);
в дочернем процессе, я думаю, или написать для него другой обработчик SIGINT. - person someuser   schedule 26.02.2014