进程通信实验代码 linux
时间: 2024-01-31 11:02:32 浏览: 69
Linux进程通信代码
下面是一个简单的进程通信实验代码,使用了 Linux 的共享内存和信号量:
进程 A:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
int main()
{
int shmid, semid;
char *shm_ptr;
struct sembuf sem_op;
// 创建共享内存
shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 创建信号量
semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (semid < 0) {
perror("semget");
exit(1);
}
// 初始化信号量
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
if (semop(semid, &sem_op, 1) < 0) {
perror("semop");
exit(1);
}
// 将共享内存映射到进程地址空间
shm_ptr = shmat(shmid, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat");
exit(1);
}
// 写入数据到共享内存
sprintf(shm_ptr, "Hello, world!");
// 发送信号量
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
if (semop(semid, &sem_op, 1) < 0) {
perror("semop");
exit(1);
}
// 解除共享内存映射
if (shmdt(shm_ptr) < 0) {
perror("shmdt");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) < 0) {
perror("shmctl");
exit(1);
}
// 删除信号量
if (semctl(semid, 0, IPC_RMID) < 0) {
perror("semctl");
exit(1);
}
return 0;
}
```
进程 B:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
int main()
{
int shmid, semid;
char *shm_ptr;
struct sembuf sem_op;
// 获取共享内存
shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 获取信号量
semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (semid < 0) {
perror("semget");
exit(1);
}
// 初始化信号量
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
if (semop(semid, &sem_op, 1) < 0) {
perror("semop");
exit(1);
}
// 将共享内存映射到进程地址空间
shm_ptr = shmat(shmid, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat");
exit(1);
}
// 读取共享内存中的数据
printf("Message: %s\n", shm_ptr);
// 发送信号量
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
if (semop(semid, &sem_op, 1) < 0) {
perror("semop");
exit(1);
}
// 解除共享内存映射
if (shmdt(shm_ptr) < 0) {
perror("shmdt");
exit(1);
}
return 0;
}
```
上面的代码中,进程 A 通过共享内存写入了一条消息,然后通过信号量发送通知给进程 B,进程 B 通过共享内存读取了这条消息。注意,为了保证进程 A 和进程 B 能够访问同一块共享内存,它们需要使用相同的共享内存 ID。同时,为了避免进程 A 和进程 B 同时操作共享内存,需要使用信号量进行同步。
阅读全文