信号发送函数kill()和raise()

 kill()函数同读者熟知的kill系统命令一样,可以发送信号给进程或进程组(实际上,kill系统命令只是kill()函数的一个用户接口)。这里需要注意的是,它不仅可以中止进程(实际上发出SIGKILL信号),也可以向进程发送其他信号。

    与kill()函数不同的是,raise()函数允许进程向自身发送信号。

    表1列出了kill()函数的语法要点。

表1  kill()函数语法要点

信号发送函数kill()和raise()


下面的示例首先使用fork()创 建了一个子进程,接着为了保证子进程不在父进程调用kill()之前退出,在子进程中使用raise()函数向自身发送SIGSTOP信号,使子进程暂 停。接下来在父进程中调用kill()向子进程发送信号,在该示例中使用的是SIGKILL,读者可以使用其他信号进行练习。

/* kill_raise.c */

        #include <stdio.h>

        #include <stdlib.h>

        #include <signal.h>

        #include <sys/types.h>

        #include <sys/wait.h>


    
        int main()

        {

            pid_t pid;

            int ret;


    
            /* 创建一个子进程 */

            if ((pid = fork()) < 0)

            {

                printf("Fork error\n");

                exit(1);

            }


    
            if (pid == 0)

            {

                /* 在子进程中使用raise()函数发出SIGSTOP信号,使子进程暂停 */

                printf("Child(pid : %d) is waiting for any signal\n", getpid());

                raise(SIGSTOP);

                exit(0);

            }

            else

            {
                //注意这步虽然简单,但是不能忽略!!!
                sleep(2);
                 /* 在父进程中收集子进程发出的信号,并调用kill()函数进行相应的操作 */

                if ((waitpid(pid, NULL, WNOHANG)) == 0)

                {

                    if ((ret = kill(pid, SIGKILL)) == 0)

                    {

                        printf("Parent kill %d\n",pid);

                    }

                }


    
                waitpid(pid, NULL, 0);

                exit(0);

            }

        }

 该程序运行结果如下:

    $ ./kill_raise

        Child(pid : 4877) is waiting for any signal

        Parent kill 4877

  本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》

  转载于信号发送函数kill()和raise()

你可能感兴趣的:(linux,kill,信号,raise,进程间通信)