进程间通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信号
#include <signal.h> void catch_alarm(int sig) { ………………….. } signal(SIGALRM, catch_alarm); alarm(10);
关键字和标识
每个IPC资源由两个唯一的标志与之相连:关键字(key)和标识(id) #include <sys/ipc.h> key_t ftok(const char * path, int id); path:一个已经存在的文件路径名 id:只有低8位有效,如果低8位为0,ftok()行为不确定 标识的作用有点类似于文件描述字,当进程调用shmget、semget、和 msgget将获得一个IPC资源时便得到该资源的标识id. 每一个IPC资源标识与一个数据结构xxxid_ds相连,该结构也叫 IPC资源描述结构,例如消息队列标识相连的为msgid_ds结构
消息队列在业务监控项目中的应用
Web(Java,jsp) ParseReport
消息类型1
进程 GoAhead
执行添加、修改、 删除规则等操作后, 由前端java调用.so 动态库来给进程 GoAhead发送消息
消息类型2
SavReport
消息类型3
RunAlert
消息队列在业务监控项目中的应用
typedef struct st_mesg { int mesg_len; long mesg_type; char mesg_data[50]; } STRUCT_MESG; class mesg { public: mesg(int i); virtual ~mesg(); bool PutIntoMsg(STRUCT_MESG *in_data); //放入队列 int GetFromMsg(STRUCT_MESG *out_data); //队列取数 据 bool ClearMsg(); bool destoryMsg(); ………………….. } //清除消息队列中所有数据 //销毁消息队列
struct mymsg mg; msgrcv(msqid, (void *) &mg, 1, 0, IPC_NOWAIT)
消息队列应用(接收)
#include <sys/ipc.h> ……………………….. #define BUF_SIZE struct my_msg{ long int my_msg_type; char text[BUF_SIZE]; }; int main(){ struct my_msg msgbuf; int msgid;
消息队列操作
消息队列初始化
消息队列控制
发送和接收消息
消息队列初始化
#include <sys/msg.h> int msgget(key_t key,int msgflg);
msgflg:
IPC_EXCL 例如:
指明队列的访问权限和创建标志
IPC_CREAT 如果不存在与key相连的消息队列,创建与它相连的队列 如果同时指定IPC_CREAT,当队列已经存在时,调用失败
消息队列在业务监控项目中的应用
bool mesg::PutIntoMsg(STRUCT_MESG *in_data) { if (msgsnd(msqid, &(in_data->mesg_type), in_data->mesg_len, IPC_NOWAIT) != 0 ) { return false; } return true; } int mesg::GetFromMsg(STRUCT_MESG *out_data) { int n = 0; //所接收数据大于 所接收数据大于length参数时,截短数据, 参数时, 所接收数据大于 参数时 截短数据, 不返回错误 n = msgrcv(msqid, &(out_data->mesg_type), sizeof(out_data->mesg_data), out_data->mesg_type, IPC_NOWAIT); if(errno == ENOMSG) return NO_MESSAGE; out_data->mesg_len = n; return (n); }
消息队列
msg_perm 发送进程 类型|消息 发送进程 新消息添加 在队列尾 msg
struct msgid_ds 接收进程 msg msg 类型|消息 接收进程 从队列头 读消息
消息队列(msqid_ds结构成员)
struct ipc_perm msg_perm struct msg struct msg msgqnum_t msglen_t pid_t pid_t time_t time_t time_t *msg_first *msg_last msg_qnum msg_qbytes msg_lspid msg_lrpid msg_stime msg_rtime msg_ctime 操作许可权限数据结构指针 指向队列中第一条消息的指针 指向队列中最后一条消息的指针 队列中当前消息个数 队列中所允许的最大字节个数 最后一个发送消息者 最后一个接收消息者 最后一条消息的发送时间 最后一条消息的接收时间 最后的改变时间
struct mymsg mg; msgsnd(msqid, (void *) &mg, 1, IPC_NOWAIT)
发送和接收消息
int msgrcv(int msqid, void * msgp,size_t msgsz, long int msgtyp, int msgflg); 参数说明 msgtyp: =0 >0 个最低类型的消息 msgflg: IPC_NOWAIT IPC_NOERROR <0 接收队列中第一个消息 接收其类型等于msgtyp的第一个消息 接收其类型小于或等于msgtyp绝对值的第一
发送和接收消息
#include <sys/msg.h> int msgsnd(int msqid, conset void * msgp, size_t msgsz, int msgflg); struct mymsg{ long int char 参数说明 msgp: msgflg: 指向用户消息缓冲区的指针。 IPC_NOWAIT mtype; mtext[1]; /*消息类型*/ /*消息正文*/ };
} } return 0;
while (1) { 20 if (msgrcv(msgid, (void *)&msgbuf,BUF_SIZE, 0, 0) == -1) printf("msgrcv failed\n");
else { printf("You wrote: %s",msgbuf,text); if (strncmp(msgbuf.text, "end",3) == 0) break; }
进程间通信
吴卫东 2005.11 西安银博科技发展公司 Xi‘an Yinbo Science&Technologe Development Company.
介绍
进程间通信(Inter-process Communication IPC)描述 的是从一个进程向另一个进程发送数据的方法。在多 进程应用中,进程之间常常需要交换数据,即相互通信。 尽管利用文件可以实现进程间的通信,但使用进程间 通信机制则更为方便、更为专业,适应的范围也更广 泛。IPC常常用于进程之间的协同工作,例如让两个程 序使用存储器中同一数据区而互不干扰,或者使得由 一个进程请求的数据能被另一个进程使用。进程在核 心的协调下进行相互间的通讯。Linux支持大量进程间 通讯(IPC)机制。主要有以下几种方式
消息队列控制
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数cmd指定的操作为: IPC_STAT IPC_SET IPC_RMID 复制msqid指定的消息队列的内核控制结构到buf中 设置msqid指定的消息队列的权限以及消息队列的字节数 删除msqid以及它所指定的消息队列和相连的数据结构
int msgid; msgid = msgget(ftok(“/home/a/etc/msg”,1),0666|IPC_CREAT);
消息队列控制
#include <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf);
查看消息队列相连的数据结构 改变消息队列的许可权限 改变消息队列的拥有者 改变消息队列的字节大小 删除一个消息队列 msgctl(msqid, IPC_RMID, NULL);
进程间通信
匿名管道 命名管道(FIFO) 信号 套接字 System V消息队列 System V信号量 System V共享内存
进程间通信的一些基本概念
进程阻塞
当一个进程在执行某些操作的条件得不到满足时,就自动放弃CPU资源而进入休眠状 态,以等待条件得满足。当操作条件满足时,系统将控制权返还给该进程继续进行未完的 操作
fdes[0] 子进程
匿名管道
建立一匿名管道 系统调用格式 pipe(filedes) 参数定义 int pipe(filedes); int filedes[2]; 其中,filedes[1]是写入端,filedes[0]是读出端。 该函数使用头文件如下: #include <unistd.h>
共享资源
因为计算机的内存、存储器等资源是有限的,无法为每一个进程都分配一份单独的资 源。所以系统将这些资源在各个进程间协调使用。
锁定
保证共享资源在被某个进程使用时,别的进程无法使用。这就叫做共享资源的锁定。
原子操作
指一个操作不会被任何情况所中断,整个操作能一次完成。
匿名管道
in 父进程 fdes[1] out 内核
if ((msgid = msgget((key_t)1234, 0666 | IPC_CREAT)) == -1) { printf("msgget failed\n"); return –1; }
消息队列应用(发送)
#include <sys/ipc.h> ……………………….. #define BUF_SIZE struct my_msg{ long int my_msg_type; char text[BUF_SIZE]; }; int main(){ struct my_msg msgbuf; int msgid; if ((msgid = msgget((key_t)1234, 0666 | IPC_CREAT)) == -1) {printf("msgget failed\n"); return –1;} while (1) { printf("Enter some text:"); fgets(msgbuf.text, BUF_SIZE ,stdin); } } return 0; if 20 msgbuf.my_msg_type = 1; if (msgsnd(msgid, (void *)&msgbuf,BUF_SIZE,0) == -1) printf(“msgsnd failed\n”); (strncmp(msgbuf.text, "end",3) == 0) break;
int mknod(const char * path,mode_t mode, dev_t dev); mknod(“/tmp/myfifo”,S_IFIFO|0666,0) prw-rw-rwmyfifo
信号
信号是UNIX操作系统用来通知进程发生事件的一种手段,这种事件常 常与进程当前的活动无关,并且其发生需要提醒进程注意。信号也称为软中 断,它提供了一种处理异步事件的方法。信号也可以用于进程之间进行通信 和实现同步原语。
消息队列
源自文库
提供一种广义的消息传递方法,允许进程发送 和接收一个缓冲区中数据。希望通信的一组进程通 过一个具有唯一标识的消息队列连接在一起。要传 送的任意数据打成包并以消息的形式通过消息队列 传送。消息的格式可以由操作系统规定,也可以由 协同工作的进程规定。消息队列种的所有消息按照 它们提交的顺序传递。
ipc_perm结构
每个IPC资源是系统中可以被多个用户访问的资源,因此他们也类似于文件一样具 有属主、用户组以及访问权限的问题 #include <sys/ipc.h> ipc_perm结构 uid gid cuid cgid mode IPC资源当前所有者的用户ID IPC资源当前所有者的组ID IPC资源创建者的用户ID IPC资源创建者的组ID 读写许可权限 位 0400 0200 0040 0020 0004 0002 描述 拥有者读 拥有者写 组成员读 组成员写 其他人读 其他人写
命名管道(FIFO)
创建FIFO特别文件的方法: mknod myfifo p mkfifo -m 0666 myfifo #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char * path,mode_t mode); mkfifo(“/tmp/myfifo”, 0666)