文章目录
  1. 1. IPC的ID与key键
  2. 2. IPC权限结构ipc_perm
  3. 3. 进程通信之五:消息队列通信
  4. 4. 进程通信之四:信号量通信

System V提供的IPC机制有三种:信号量、消息队列、共享内存。本文介绍前两种。
头文件:sys/msg.hsys/ipc.h
使用ipcs可以查看系统正使用的IPC工具:
ipcs命令

IPC的ID与key键

每一个IPC都用唯一的ID来标识、使用。一般利用key键来获得一个IPC的ID。而key可以通过ftok()产生。
key_t ftok(char *pathname,int id);

IPC权限结构ipc_perm

1
2
3
4
5
6
7
8
struct ipc_perm{
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
mode_t mode;
......
};

进程通信之五:消息队列通信

1
2
3
4
5
6
7
8
9
10
11
12
13
struct msqid_ds {
struct ipc_perm msg_perm;
msgqnum_t msg_qnum; /* # of messages on queue */
msglen_t msg_qbytes; /* max # of bytes on queue */
pid_t msg_lspid; /* pid of last msgsnd() */
pid_t msg_lrpid; /* pid of last msgrcv() */
time_t msg_stime; /* last-msgsnd() time */
time_t msg_rtime; /* last-msgrcv() time */
time_t msg_ctime; /* last-change time */
.
.
.
};

代码示例:发送端和接收端利用消息队列进行通信。通信示意图:
IPC_msg
发送端代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//msg_sender
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#define KEY_PATH "/home/tao"
struct msgbuf{
int type;
char ptr[0];
};

int main(int argc,char *argv[])
{

key_t key;
key=ftok(KEY_PATH,100);
int msgid;
msgid=msgget(key,IPC_CREAT|0600);
printf("msgid=%d\n",msgid);
pid_t pid;
pid=fork();
if(pid==0)
{
while(1)
{
printf("input msg to be sent:");
char buf[128];
fgets(buf,128,stdin);
struct msgbuf *ptr = malloc(sizeof(struct msgbuf)+strlen(buf)+1);
ptr->type=1;//发送消息类型为1的消息
memcpy(ptr->ptr,buf,strlen(buf)+1);
msgsnd(msgid,ptr,strlen(buf)+1,0);
free(ptr);
}
}
else
{
struct msgbuf{
int type;
char ptr[1024];
};
while(1)
{
struct msgbuf mybuf;
memset(&mybuf,'\0',1024);
msgrcv(msgid,&mybuf,1024,2,0);//接受消息类型为2的消息
printf("receive msg:%s\n",mybuf.ptr);
}
}
}

接收端代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//msg_receiver
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#define KEY_PATH "/home/tao"
struct msgbuf{
int type;
char ptr[0];
};

int main(int argc,char *argv[])
{

key_t key;
key=ftok(KEY_PATH,100);
int msgid;
msgid=msgget(key,IPC_CREAT|0600);
printf("msgid=%d\n",msgid);
pid_t pid;
pid=fork();
if(pid==0)//子进程发送消息
{
while(1)
{
printf("input msg to be sent:");
char buf[128];
fgets(buf,128,stdin);
struct msgbuf *ptr = malloc(sizeof(struct msgbuf)+strlen(buf)+1);
ptr->type=2; //发送消息类型为2的消息
memcpy(ptr->ptr,buf,strlen(buf)+1);
msgsnd(msgid,ptr,strlen(buf)+1,0);
free(ptr);
}
}
else
{
struct msgbuf{
int type;
char ptr[1024];
};
while(1)
{
struct msgbuf mybuf;
memset(&mybuf,'\0',1024);
int ret=msgrcv(msgid,&mybuf,1024,1,0);//接受消息类型为1的消息
printf("receive msg:%s\n",mybuf.ptr);
}
}
return 0;
}

进程通信之四:信号量通信

一般用于避免并发访问共享资源。比如生产者消费者问题。
用的比较少。没啥好说的。需要时补充。

文章目录
  1. 1. IPC的ID与key键
  2. 2. IPC权限结构ipc_perm
  3. 3. 进程通信之五:消息队列通信
  4. 4. 进程通信之四:信号量通信