waitpid()不允许将SIGINT发送到子进程?

时间:2011-03-04 04:50:45

标签: c unix

#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的部分)

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

问题是子进程获得了与SIGINT相同的重写处理程序。您可能希望在fork之后重置子进程中的信号处理程序,或者您可能希望在已经分叉子进程后在父进程中安装信号处理程序,因此它不会继承覆盖处理程序。