Linux 进程间通讯之信号方式

来源:互联网 发布:非诚勿扰网络播出时间 编辑:程序博客网 时间:2024/04/18 13:53

创建几种信号:

SIGHUP: 从终端上发出的结束信号

SIGINT:来自键盘的中断信号(Ctrl-C

SIGQUIT:来自键盘的退出信号Ctrl-\

SIGKILL:该信号结束接收信号的进程

SIGTERM: kill命令发出的信号

SIGCHLD:标识子进程停止或结束的信号

SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号

 

信号处理:

一、忽略此信号;(但SIGKILLSIGSTOP信号不可被忽略)

二、执行用户希望的动作;(调用一个用户函数,执行用户希望的处理)

三、执行系统默认动作;(对大多数信号的系统默认动作是终止进程)

 

 

信号发送:(主要函数有killraise

区别:

         kill既可以向自身发送信号,也可以向其他进程发送信号,raise是向进程自身发送信号。

intkill(pid_t pid, int signo)

intraise(int signo)

 

alarm方式发送:

         使用alarm函数可以设置一个时间值,当所设置的时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止此进程。

unsigned  int alarm(unsigned  int seconds)

seconds:经过了指定的seconds秒后会产生SIGALRM

 

pause函数:

         使调用进程挂起,直至捕捉到一个信号。

intpause(void)

只有执行了一个信号处理函数后,挂起才结束

 

signal

void(*signal (int signo, void (*func)(int)))(int)

-->

typedef void (*sighandler_t)(int)

sighandler_t signal(int signum,sighandler_t handler)

func可能的值:

1SIG_IGN:忽略此信号

2SIG_DFL:按系统默认方式处理

3、信号处理函数名:使用该函数处理

 

示例程序:

等待接收信号代码:

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <stdlib.h>

 

void my_func(int sign_no){

         if(sign_no==SIGINT)

                   printf("SIGINT.\n");

         elseif(sign_no==SIGQUIT)

                   printf("SIGQUIT.\n");

}

 

int main(){

         intpid = getpid();

         printf("pidis: %d\n", pid);                 //获取进程的pid

         signal(SIGINT,  my_func);

         signal(SIGQUIT,  my_func);

 

         pause();

         exit(0);

}

 

测试代码:

#include <stdio.h>

#include <signal.h>

 

int main(){

         kill(4909, SIGINT);                      //注: 4909是上面输出的进程pid

}

也可以使用kill命令发

kill-s SIGINT 4909kill -s SIGQUIT 4909

也可以按Ctrl + CSIGINT信号)或者Ctrl + \SIGQUIT信号)

 

0 0
原创粉丝点击