一.信号
* <signal.h> <sys/type.h> <unistd.h>
* int sigaction( SIGINT, &act , 0 ) ; act结构体:struct sigaction act; { act.sa_handler = abc; sigemptyset (& act.sa_mask ) ; act.sa_flags=0; }
* int kill (pid_t pid , int sig ) unsigned int alarm( unsigned int seconds) ; pause() getppid() getpid() void ding( ing sig) {} 这个是信号注册函数。 pid_t waitpid() fork() ==0 子进程 -1 失败 system() wait() 父等待子
--------------------------------------------------------
二。进程间的通信:管道
file=popen(命令,r or w ) ;通过file来,fwrite 读 fread 写
FIFO 先进先出 LIFO 后进先出 , pipe调用(file[2]) :不需要启动一个shell , ---> 父子进程的读写通信 , dup() dup2() FIFO文件
管道具有阻塞特性------进程同步和数据的双向传递。
----------------------------------------------------------
三。IPC机制
一。信号量:0 和 1 :二进制信号量 多个正整数值:通用信号量
* linux 信号量函数都是针对成组的通用信号量进行操作的。
* <sys/sem.h>
*int semget(key_t key , int num_sems, int sem_flags);; 创建一个信号量或获取一个已有的信号量。
参数1:随便给一个数作为键 。 参数2:信号数量:一般为1 参数3: IPC_)CREAT || 0666 IPC_EXCL
*int semop(int sem_id , struct sembuf *sem_ops, size_t num_sem_ops );
用于改变信号量的值: + 1 -1
struct sembuf {
short sem_num ; 信号量编号,除非你使用一组信号量,否则一般取0
short sem_op; +1 p 操作 -1 v操作
short sem_flg ; 一般设为sem_UNDO 要求系统自动清理该信号量
}
* int semctl( int sem_id , int sem_num , int command , .. ); 控制信号量函数
参数2:一般为0,除非一组。 参数3:命令:设置呢还是删除呢 如果设置的话,参数4就是一个结构体罗。 即设过去罗
插入代码:493页
关键在于:可以封装成5个函数,1 get 创建或获取 2.初始化它 3.+1 p操作函数 4.-1 v 操作函数 5. 删除清理它
------------------------------------------------------
二。共享内存 :通过小消息来同步对该内存的访问(同步由程序员来实现)。 (在共享内存中搞个小成员标识一下是否可读,或者现在可写了。)
共享内存使用的函数类似于信号量函数,4个基本函数:
* <sys/shm.h> shm_i 4个基本函数。
* int shmget ( key_t key , size_t size , int shmflg ); 创建共享内存; 参数2:内存大小(字节) , 参数3:读写权限设置 IPC_CREAT | 0666
*void * shmat (int shm_id , const void * shm_addr , int shmflg); 将物理内存映射到进程内存
参数2: 给空指针,有系统自动选择地址映射 参数3:给0,由系统选一个连接地址。
* void shmdt(void* ) 参数是shmat()返回的地址指针。 解除映射,并未删除,即当前进程不可用该共享内存了。
* int shmctl (int shm_id , int command , sturct shmid_ds *buf) ; 共享内存控制函数 :删除,设置值。
(已删除的共享内存,会直到它从最后一个进程中分离为止,才真正的删除掉了。)
?消费者和生产者?
插入代码:499页 ------》 共享内存 1. 消息标志 (1,0):用来控制同步 2.共享的数据:用来共享滴。
------------------------------------------------------
四。消息队列: 提供了一种在两个不相关的进程之间传递数据的简单又有小的方法。
* <sys/msg.h> 头文件
*int msgget(key_t key , int msg_flg); 创建和访问一个消息队列, 参数2: 由IPC_CREAT定义的一个特殊值和权限标志按或才能创建一个新的消息队列。
* int msgsnd(int msqid , const void *msg_ptr , size_t msg_sz, int msg_flg ); 把消息添加到消息队列中去。
参数2:消息指针 参数3:消息长度 参数4:如果消息队列满了,那么返回-1 呢还是 阻塞呢 等它减去一个呢。 所以这个是标识位
消息类型应该是如下类似结构:struct my_msg{ long int msg_type; char mydata[100] ;} 第二个成员是随意一个类型。
* int msgrcv ( int msgid , void * msg_ptr , size_t msg_sz , long int msgtype, int msgflg); 获取消息
参数2:接收这个消息的指针 参数3:消息长度 参数4:消息类型 0 >0 <0 参数4: 没有消息的情况下如何处理呢?
* int msgctl (int msqid , int command , struct msqid _ds *buf); 消息队列控制函数, 同共享内存类似的功能。
插入代码! 消息队列无需进程提供同步方法。
-----------------------------------------------------------------------
大数据:用共享内存
小数据:用消息队列
IPC命令(shell命令):用来清理系统游离的IPC机制。
ipcs -s ipcs -m ipcs -q ;查看 信号量 共享内存 消息队列
ipcrm -s id ipcrm -m id ipcrm -q id ; 删除系统游戏的IPC机制。