Linux下C语言进程通讯编程

时间:2021-04-01 14:53:34

代码:

 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/shm.h>
4 /*************基本的函数API********************
5 共享内存函数API
6 int shmget(key_t key, int size, int flag)
7 key:
8 共享内存的键值,多个进程可以通过它访问同一个共享内存。常用特殊值:IPC_PRIVATE,创建当前进程的私有共享内存
9 size:
10 指定创建共享内存的大小
11 flag:
12 操作权限
13 char * shmat(int shm_id, const void * addr, int flag)
14 shm_id:
15 要映射的共享内存标识符
16 addr:
17 指定在调用进程中映射共享内存的地址。通常取值为0,表示由系统自动分配地址。
18 flag:
19 设置共享内存的操作权限。若取值为0,表示可对共享内存进行读写操作。
20 int shmctl(int shm_id, int cmd, struct shmid_ds * buf)
21 shm_id:
22 共享内存标识符
23 cmd:
24 指定索要进行的操作:IPC_STAT IPC_SET IPC_RMID SHM_LOCK SHM_UNLOCK
25 buf:
26 结构体型指针
27 int shmdt(const void * addr)
28 **********************************************/
29 #define Test_pipe 0
30 #define Test_Shmget 0
31 #define Test_AT_w 0
32 #define Test_AT_r 0
33 #define Test_DT 1
34 int main(int argc, char *argv[])
35 {
36 #if Test_pipe
37 int x,fd[2];
38 char buf[30],s[30];
39 pipe(fd);
40 x = fork();
41 if(0 == x)
42 {
43 sprintf(buf,"This is an pipe!");
44 write(fd[1],buf,30);
45 exit(0);
46 }
47 else
48 {
49 wait(0);
50 read(fd[0],s,30);
51 printf("read: %s\n",s);
52 }
53 #endif
54
55 #if Test_Shmget
56 int shm_id;
57 shm_id = shmget(IPC_PRIVATE,4096,0666);
58 if(shm_id < 0)
59 {
60 perror("shmget id < 0");
61 exit(0);
62 }
63 printf("成功建立共享内存区域: %d\n",shm_id);
64 system("ipcs -m");
65 #endif
66
67 #if Test_AT_w
68 int shm_id;
69 char *shm_buf;
70 shm_id = atoi(argv[1]);
71 shm_buf = shmat(shm_id,0,0);
72 printf("写如数据到共享内存:\n");
73 sprintf(shm_buf,"对共享内存的读写操作!");
74 printf("%s\n",shm_buf);
75 #endif
76
77 #if Test_AT_r
78 int shm_id;
79 char *shm_buf,str;
80 shm_id = atoi(argv[1]);
81 shm_buf = shmat(shm_id,0,0);
82 printf("写如数据到共享内存:\n");
83 sprintf(str,shm_buf);
84 printf("%s\n",str);
85 system("ipcs -m");
86 #endif
87
88 #if Test_DT
89 int shm_id;
90 char *shm_buf;
91 shm_id = atoi(argv[1]);
92 shm_buf = shmat(shm_id,0,0);
93 shmdt(shm_buf);
94 shmctl(shm_id,IPC_RMID,NULL);
95 system("ipcs -m");
96 #endif
97 }

未完待续~