Bootstrap

学习笔记(linux高级编程)11

进程间通信 ===》信号通信

    应用:异步通信。 中断,,

    1~64;32应用编程。

    如何响应:

     Term   Default action is to terminate the process.

       Ign    Default action is to ignore the signal.

       wait

       Core   Default action is to  terminate  the  process  and  dump  core  (see

              core(5)).

         gdb a.out -c core

       Stop   Default action is to stop the process.

       Cont   Default  action  is  to  continue  the  process  if  it is currently

              stopped.

    kill      -xx     xxxx

    发送进程  信号    接收进程

    kill -9 1000

    a.out  9 1000

    1、发送端

    #include <sys/types.h>

    #include <signal.h>

int kill(pid_t pid, int sig);

    功能:通过该函数可以给pid进程发送信号为sig的系统信号。

    参数:pid 要接收信号的进程pid

           sig 当前程序要发送的信号编号 《=== kill  -l

    返回值:成功 0

             失败  -1;

int raise(int sig)== kill(getpid(),int sig);

    功能:给进程自己发送sig信号

unsigned int alarm(unsigned int seconds);SIGALAM

    功能:定时由系统给当前进程发送信号

           也称为闹钟函数

           闹钟只有一个,定时只有一次有效,

           但是必须根据代码逻辑是否执行判断。

int pause(void);

    功能:进程暂停,不再继续执行,除非

           收到其他信号。

2、信号  kill  -l  ==>前32个有具体含义的信号

3、接收端

         每个进程都会对信号作出默认响应,但不是唯一响应。

         一般如下三种处理方式:

         1、默认处理

         2、忽略处理 9,19

         3、自定义处理 9,19 捕获

         以上三种方式的处理需要在如下函数上实现。

信号注册函数原型:

     void ( *signal(int signum, void (*handler)(int)) ) (int);


sighandler_t signal(int signum, sighandler_t handler);

ipcs -a 查询共享内存,信号量集,消息队列

    ipcrm -s 删除信号量集

           -m 删除共享内存

共享内存 ===》效率最高的进程间通信方式

system v :  共享内存  信号量集

   IPC对象操作通用框架:

   0x  ftok

   key值 ==> 申请 ==》读写 ==》关闭 ==》卸载

操作流程:

    key ==》申请对象 ==》映射对象==》读写对象

        ==》撤销映射 ==》删除对象

1.ftok()创建临时键值。

   #include <sys/types.h>

   #include <sys/ipc.h>

                "/etc"                         '!'

   key_t ftok(const char *pathname, int proj_id);

   功能:通过该函数可以将pathname指定的路径用来以

         proj_id生成唯一的临时键值。

   参数:pathname 路径+名称===》任意文件,只要不会

         被删除重建即可。

         proj_id  整形的数字,一般用ASCII码的单字符

         表示与参数1的运算。

   返回值:成功 返回唯一键值

            失败  -1;

2、申请对象:shmget()

   #include <sys/ipc.h>

   #include <sys/shm.h>

   ps aux|grep a.out

       share memory get               IPC_CREAT|0666

   int shmget(key_t key, size_t size, int shmflg);

   功能:使用唯一键值key向内核提出共享内存使用申请

   参数:key  唯一键值

         size  要申请的共享内存大小

         shmflg 申请的共享内存访问权限,八进制表示

         如果是第一个申请,则用IPC_CREAT

         如果要检测是否存在,用IPC_EXCL

   返回值:成功 返回共享内存id,一般用shmid表示

            失败  -1;

3.映射对象:shmat()

   void *shmat(int shmid, const void *shmaddr, int shmflg);

   功能:将指定shmid对应的共享内存映射到本地内存。

   参数:shmid 要映射的本地内存

         shmaddr 本地可用的地址,如果不确定则用NULL,表示

                  由系统自动分配。

         shmflg 

         0,表示读写

         SHM_RDONLY,只读

   返回值:成功 返回映射的地址,一般等于shmaddr

            失败 (void*)-1

;