IPC--信号操作-example

来源:互联网 发布:淄博seo诊断公司 编辑:程序博客网 时间:2024/05/16 09:20

linux下的信号应用,简单的讲只有三件事情:

  1. 安装信号(推荐使用sigaction());
  2. 实现三参数信号处理函数,void handler(int signal,struct siginfo *info, void *);
  3. 发送信号,推荐使用sigqueue()。

demo1:信号发送及处理

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
        struct sigaction act;  
        int sig;
        sig=atoi(argv[1]);
        
        sigemptyset(&act.sa_mask);
        act.sa_flags=SA_SIGINFO;
        act.sa_sigaction=new_op;
        
        if(sigaction(sig,&act,NULL) < 0)
        {
               printf("install sigal error\n");
        }
        
        while(1)
        {
               sleep(2);
               printf("wait for the signal\n");
        }
}
void new_op(int signum,siginfo_t *info,void *myact)
{
        printf("receive signal %d", signum);
        sleep(5);
}

 

说明,命令行参数为信号值,后台运行sigreceive signo &,可获得该进程的ID,假设为pid,然后再另一终端上运行kill -s signo pid验证信号的发送接收及处理。同时,可验证信号的排队问题。 


实例二:信号传递附加信息

功能:向进程本身发送信号,并传递指针参数;

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
        struct sigaction act;  
        union sigval mysigval;
        int i;
        int sig;
        pid_t pid;             
        char data[10];
        memset(data,0,sizeof(data));
        for(i=0;i < 5;i++)
               data[i]='2';
        mysigval.sival_ptr=data;
        
        sig=atoi(argv[1]);
        pid=getpid();
        
        sigemptyset(&act.sa_mask);
        act.sa_sigaction=new_op;//三参数信号处理函数
        act.sa_flags=SA_SIGINFO;//信息传递开关
        if(sigaction(sig,&act,NULL) < 0)
        {
               printf("install sigal error\n");
        }
        while(1)
        {
               sleep(2);
               printf("wait for the signal\n");
               sigqueue(pid,sig,mysigval);//向本进程发送信号,并传递附加信息
        }
}
void new_op(int signum,siginfo_t *info,void *myact)//三参数信号处理函数的实现
{
        int i;
        for(i=0;i<10;i++)
        {
               printf("%c\n ",(*( (char*)((*info).si_ptr)+i)));
        }
        printf("handle signal %d over;",signum);
}

 

这个例子中,信号实现了附加信息的传递,信号究竟如何对这些信息进行处理则取决于具体的应用。



原创粉丝点击