linux下的信号应用,简单的讲只有三件事情:
- 安装信号(推荐使用sigaction());
- 实现三参数信号处理函数,void handler(int signal,struct siginfo *info, void *);
- 发送信号,推荐使用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);
} |
这个例子中,信号实现了附加信息的传递,信号究竟如何对这些信息进行处理则取决于具体的应用。
Linux下信号应用与处理
本文详细介绍了Linux环境下信号的应用,包括安装信号、处理信号和发送信号的基本操作。通过两个实例演示了如何实现信号发送与接收,以及如何利用信号传递附加信息。重点阐述了信号处理函数的使用和信号的排队问题。
713

被折叠的 条评论
为什么被折叠?



