发送信号

一般有两种方式发送信号:raise和kill

raise函数原型为:

#include <signal.h>
int raise(int sig);

该函数向调用的进程或者线程发送信号,形参sig就是需要发送的信号。

返回值:成功返回0,失败返回非零值。需要说明的是,如果信号导致了处理函数(handler)的调用,该函数会在handler返回以后再返回。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

void sig_handler(int sig)
{
    printf("Sig=%d\n",sig);
}

int main(int argc, char **argv)
{
    signal(SIGALRM,&sig_handler);

    while(1)
    {
        raise(SIGALRM);
        sleep(1);
    }
    return 0;
}

这种情况下,自己给自己发送信号。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
static int x=0;
void sig_handler(int sig)
{
    printf("Sig=%d\n", sig);
}

int main(int argc, char **argv)
{
    pid_t pid;
    
    signal(SIGALRM, &sig_handler);
    pid = fork();
    if (pid == 0) //child
    {
        while(1)
        {
            x=0;
       raise(SIGALRM); sleep(
3); } } else { while (1) { printf("Parent:%d\n",x); sleep(2); ++x; } } return 0; }

这个程序是子进程给父进程发送信号,此外,还验证了fork只共享了程序代码,而数据是独自使用的,在parent中,x永远不会被清零,因为子进程的x和父进程的x在fork以后无关了。

 

另外一个方法是使用kill函数,原型如下:

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

其中pid是需要发送信号到目标进程的ID,sig 是信号值。文档中说明为:The  kill()  system  call can be used to send any signal to any process group or process,因此适用范围比raise要广很多。

返回值:成功(至少一个信号被发送)时返回0,否则返回-1,并且errno会被设置。

 

posted @ 2021-02-07 15:14  castor_xu  阅读(220)  评论(0编辑  收藏  举报