IPC--信号操作-example

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);
}

 

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



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值