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

分享到:
           

    本文关键字: 信号发送函数,kill(),raise()

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

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

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

表1 kill()函数语法要点

所需头文件 #include <signal.h>
#include <sys/types.h>
函数原型 int kill(pid_t pid, int sig)
函数传入值 pid 正数:要发送信号的进程号
0:信号被发送到所有和当前进程在同一个进程组的进程
1:信号发给所有的进程表中的进程(除了进程号大的进程外)
<-1:信号发送给进程组号为-pid的每一个进程
sig:信号
函数返回值 成功:0
出错:-1

    表2列出了raise()函数的语法要点。

表2 raise()函数语法要点

所需头文件 #include <signal.h>
#include <sys/types.h>
函数原型 int raise(int sig)
函数传入值 sig:信号
函数返回值 成功:0
出错:-1

    下面的示例首先使用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
        {
            /* 在父进程中收集子进程发出的信号,并调用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应用程序开发》

   热点链接:

   1、Linux下的信号机制
   2、有名管道(FIFO)
   3、标准流管道
   4、无名管道系统调用
   5、Linux下进程间通信方式-管道

更多新闻>>