关闭

进程和信号和IPC机制:帮我记住

696人阅读 评论(0) 收藏 举报

一.信号

* <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机制。

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:620937次
    • 积分:8568
    • 等级:
    • 排名:第2340名
    • 原创:269篇
    • 转载:114篇
    • 译文:0篇
    • 评论:68条
    最新评论