linux信号通讯

一、信号的概念:

信号(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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值