一、信号的概念:
信号(signal,又简称为软中断信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。用户使用kill命令显示进程。
二、信号的处理方式:
1、对于需要处理的信号,进程可以指定处理函数,由该函数来处理
2、忽略,不作处理
3、执行默认的处理方式,保留系统的默认值(缺省操作)
三、linux支持的信号列表
[root@localhost process_share]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
四、信号发送:kill与raise
kill:表示既可以给自身发,也可以给其他进程的发送信号
raise:只能给自己发
头文件:
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int signo)
int raise(int signo)
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
void func(int sign_no)
{
if(sign_no==SIGINT)
printf("i have get SIGINT\n");
else if(sign_no==SIGQUIT)
printf("i hav get SIGQUIT\n");
}
int main()
{
printf("waiting for signal SIGINT or SIGQUIT\n");
signal(SIGINT,func);
signal(SIGQUIT,func);
pause();
exit(0);
}
五、ALarm函数 定时时间函数 pause(void)暂停时间函数,调用进程需要等到另一个信号的出现
六、系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下:
void (*signal(int signum, void (*handler)(int)))(int);
在使用该调用的进程中加入以下头文件:
#include <signal.h>
上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
七、共享内存
多个进程共享一个物理内存,其他的进程可以立即看到
特点是:访问快、不要其他的访问函数
步骤:1、创建共享内存shmget 函数
2、映射共享内存shmat函数
创建:int shmget(key_t key,int size,intg shmflag)
共享:int shmat(int shmid,char *shmaddr,int flag)
解除:int shmdt(char *shmaddr)
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<errno.h>
#define PERM S_IRUSR|S_IWUSR
int main(int argc,char *argv[])
{
int shmid;
char *p_addr,*c_addr;
if(argc!=2)
{
fprintf(stderr,"usage:%s\n\a",argv[0]);
exit(1);
}
//创建共享内存
if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
{
fprintf(stderr,"Creat share Memory ERROR:\%s\n\a",strerror(errno));
exit(1);
}
//创建子进程
if(fork())
{
p_addr=shmat(shmid,0,0);
memset(p_addr,'\0',1024);
strncpy(p_addr,argv[1],1024);
wait(NULL);// 释放共享内存
exit(0);
}
else
{
sleep(1); //暂停等待,防止子进程先运行
c_addr=shmat(shmid,0,0);
printf("Clint get %s\n",c_addr);
exit(0);
}
return 0;
}