进程通信

通过共享内存实现两个进程通信

进程通信1

进程通信2

发送方:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct shared_msg
{
int update;//更新数据标志,1:更新,0:未更新
char text[BUFSIZ];//记录写入和读取的文本
};
void main()
{
printf("程序开始\n");
key_t key;//共享内存键值
int shmid;//共享内存标识
char buf[BUFSIZ];//输入缓冲
struct shared_msg *msg;//共享内存地址

//得到键值
key = (key_t)1234;

//创建共享内存
shmid = shmget(key,sizeof(struct shared_msg),IPC_CREAT|0666);
if(shmid < 0){
//输出到错误缓冲区
fprintf(stderr, "创建共享内存失败\n");
exit(EXIT_FAILURE);
}

//将共享内存段映射到调用进程的数据段中
msg = (struct shared_msg*)shmat(shmid,NULL,0);
if( msg < (struct shared_msg*)0 ){
fprintf(stderr, "共享内存段映射到进程失败n");
exit(EXIT_FAILURE);
}
//printf("共享内存地址 %X\n", (int*)&msg);

//向共享内存中写入数据
while(1){

//向共享内存中写入数据
printf("请输入消息:");
//从缓冲区输入
fgets(buf,BUFSIZ,stdin);
strncpy(msg->text,buf,BUFSIZ);
msg->update = 1;//1表示数据更新,客户端要同步更新
printf("更新数据完成\n");

//写入数据
if(strncmp(buf,"EOF",3) == 0){
break;
}
}

//将共享内存和当前进程分离
if(shmdt(msg) < 0){
fprintf(stderr, "将共享内存和当前进程分离失败\n");
exit(EXIT_FAILURE);
}

printf("程序结束\n");
exit(EXIT_SUCCESS);
}

读取方:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct shared_msg
{
int update;//更新数据标志,1:更新,0:未更新
char text[BUFSIZ];//记录写入和读取的文本
};
void main()
{
printf("程序开始\n");
key_t key;//共享内存键值
int shmid;//共享内存标识
struct shared_msg *msg;//共享内存地址
char buf[BUFSIZ];//读取缓冲


//得到键值
key = (key_t)1234;

//创建共享内存
shmid = shmget(key,sizeof(struct shared_msg),IPC_CREAT|0666);
if(shmid < 0){
//输出到错误缓冲区
fprintf(stderr, "创建共享内存失败\n");
exit(EXIT_FAILURE);
}

//将共享内存段映射到调用进程的数据段中
msg = (struct shared_msg*)shmat(shmid,NULL,0);
if( msg < (struct shared_msg*)0 ){
fprintf(stderr, "共享内存段映射到进程失败n");
exit(EXIT_FAILURE);
}
printf("共享内存地址 %X\n", (int)msg);

//向共享内存中写入数据
while(1){
//服务端更新数据则读取
while(msg->update == 1){
sprintf(buf,"%s",msg->text);
printf("读取数据:%s",buf);
//读取完成后,将更新标志改变
msg->update = 0;
}
if(strncmp(buf,"EOF",3) == 0){
break;
}
}

//将共享内存和当前进程分离
if(shmdt(msg) < 0){
fprintf(stderr, "将共享内存和当前进程分离失败\n");
exit(EXIT_FAILURE);
}

//删除共享内存
if(shmctl(shmid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "删除共享内存失败\n");
exit(EXIT_FAILURE);
}

printf("程序结束\n");
exit(EXIT_SUCCESS);
}