在C中终止子进程后,父进程无法完成

时间:2010-09-18 20:07:19

标签: c process fork parent

我在锻炼过程中遇到了麻烦。我想分叉一个子进程并在宣布它已经分叉后挂起,并等待一个信号终止,之后父进程必须宣布它正在终止然后退出。

我可以将进程分叉并让父进程等待挂起的子进程被信号杀死,但它似乎也会杀死父进程。我试图通过其PID来杀死子进程,但没有成功。

感谢您的帮助!

代码:

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


void catchInt (int signum)
{
    printf("\nMy  sincerest apologies, master\n");
    /*kill(0, SIGINT);*/
    exit(0);
}

void ignoreInt (int signum)
{
    wait(NULL);
}

int main () {

    pid_t  pid;

    /* fork process */
    pid = fork();
    if (pid < 0) /* error handler */ 
    {      
        fprintf(stderr, "Fork Failed");
        exit(-1);
    }

    else if (pid == 0) /* child */    
    { 
        printf("Child reporting in\n");
        signal(SIGINT, catchInt);
        for ( ;; )
            pause();
    }

    else /* parent */
    {
        /* parent will wait for the child to complete */
        signal(SIGINT, ignoreInt);
        wait(NULL);
        printf("You're welcome\n");
        exit(0);
    }

}

2 个答案:

答案 0 :(得分:3)

即使假设您修改代码以便编译(您还没有定义tempPID),也会出现问题:

  • 您将孩子设置为进入睡眠状态,直到信号到达。
  • 您将父级设置为等到孩子死亡。

所以,你有一个状态,两个进程都不会再做任何事了。

您可能需要父母向孩子发送信号:

kill(pid, SIGINT);
  • 目前尚不清楚您是否需要父设置信号处理程序。
  • 您可能希望孩子设置信号处理程序。
  • 你可能不希望孩子有无限循环。
  • 哦,void main()不正确 - int main()int main(void)int main(int argc, char **argv)main()的已批准声明。
  • 如果从main()返回值(0),则更整洁。 C99标准确实允许你放弃main()的结尾并将其视为返回零,但仅当函数被正确声明为返回int时。
  • POSIX中wait()和亲戚的标头为<sys/wait.h>

而且,因为我是一个傻瓜,这里的代码可以编译,甚至可以做你想要的:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>            /* getpid() */ 
#include <stdlib.h>
#include <sys/wait.h>

void catchInt(int signum)
{
    printf("Child's PID is %d\n", (int)getpid());
    printf("My sincerest apologies, master\n");
    exit(1);
}

int main()
{
    pid_t  pid = fork();
    if (pid < 0) /* error handler */ 
    {      
        fprintf(stderr, "Fork Failed");
        exit(-1);
    }
    else if (pid == 0) /* child */    
    { 
        printf("Child reporting in\n");
        signal(SIGINT, catchInt);
        pause();
    }    
    else /* parent */
    {
        sleep(1);
        kill(pid, SIGINT);
        wait(NULL);
        printf("You're welcome\n");
    }
    return(0);
}

答案 1 :(得分:0)

刚刚弄清楚我做错了什么,我应该已经意识到SIGINT被发送到每个进程,因此父进程只是被发送一个未处理的SIGINT,导致它退出。感谢所有的帮助(对于草率的编码道歉,我真的不应该等到程序完成后才能清理它),代码已在上面编辑并按预期工作。

再次感谢。