#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <limits.h>
#include <unistd.h>
#include <stdlib.h>
#include <pwd.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sig_handler(int signal);
int pid, forkFlag = 0;
int main( int argc, char **argv, char **envp )
{
sigset(SIGINT, sig_handler); //handle ctrl + c
sigignore(SIGTSTP);
sigignore(SIGSTOP);
int ex, rv, status;
forkFlag = 1; //fork is being called
pid = fork();
if(pid == -1){
perror("fork");
exit(2);
}
else if (pid == 0){ //if child process
ex = access(argv[0], X_OK); //check if file is executable
if(ex){
perror("access");
exit(1);
}
else{
rv = execve(argv[0], argv, envp); //run program in child process
if(rv == -1){
perror("execve");
exit(1);
}
}
exit(0); //end child process
}
else{
rv = waitpid(pid, &status, 0); //wait for child
if(rv == -1){
perror("waitpid");
}
if(WEXITSTATUS(status)){ //check status of child if it did ot return 0
printf("The return status of the child was %d\n", WEXITSTATUS(status));
}
}
forkFlag=0;
}
void sig_handler(int signal)
{
if(signal == SIGINT && (pid && forkFlag)){
kill(pid,signal); //send kill to child
}
}
我正在尝试让我的程序忽略ctrl + C,除非有子进程在运行,然后它将SIGINT发送到子进程。但是,当我在子进程运行时按ctrl + c时,waitpid()返回-1并显示错误“Interrupted System Call”。这会使子进程停止运行,但如果我使用ps,子进程仍然存在,但现在标记为已不存在。我从printf语句中知道kill是函数sig_handler,而pid和forkFlag是它们正确的值。 waitpid()让我的程序忽略了kill吗?我该如何解决?我知道这段代码几乎没有,但它只是我代码的一小部分(唯一涉及fork的部分)
感谢您的帮助。
答案 0 :(得分:2)
问题是子进程获得了与SIGINT相同的重写处理程序。您可能希望在fork之后重置子进程中的信号处理程序,或者您可能希望在已经分叉子进程后在父进程中安装信号处理程序,因此它不会继承覆盖处理程序。