两个非父子进程使用共享内存互斥量进行进程间通信,C语言
时间: 2024-05-04 08:19:41 浏览: 155
共享内存的进程间通信
5星 · 资源好评率100%
共享内存和互斥量都是进程间通信的常用方式。下面是一个简单的示例程序,展示了两个非父子进程之间如何使用共享内存和互斥量进行通信。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
int main()
{
int shmid, semid, pid;
char *shmaddr;
struct sembuf sem_b;
// 创建共享内存
shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT|0666);
if(shmid == -1)
{
perror("shmget");
exit(EXIT_FAILURE);
}
// 创建互斥量
semid = semget(IPC_PRIVATE, 1, IPC_CREAT|0666);
if(semid == -1)
{
perror("semget");
exit(EXIT_FAILURE);
}
// 初始化互斥量
semctl(semid, 0, SETVAL, 1);
// 创建子进程
pid = fork();
if(pid == -1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if(pid == 0) // 子进程
{
// 连接共享内存
shmaddr = (char *)shmat(shmid, NULL, 0);
if(shmaddr == (void *)-1)
{
perror("shmat");
exit(EXIT_FAILURE);
}
// 等待互斥量
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
semop(semid, &sem_b, 1);
// 向共享内存写入数据
sprintf(shmaddr, "Hello, world!");
// 释放互斥量
sem_b.sem_op = 1;
semop(semid, &sem_b, 1);
// 断开共享内存连接
shmdt(shmaddr);
exit(EXIT_SUCCESS);
}
else // 父进程
{
// 连接共享内存
shmaddr = (char *)shmat(shmid, NULL, 0);
if(shmaddr == (void *)-1)
{
perror("shmat");
exit(EXIT_FAILURE);
}
// 等待互斥量
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
semop(semid, &sem_b, 1);
// 从共享内存读取数据
printf("Received message: %s\n", shmaddr);
// 释放互斥量
sem_b.sem_op = 1;
semop(semid, &sem_b, 1);
// 断开共享内存连接
shmdt(shmaddr);
// 删除共享内存和互斥量
shmctl(shmid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID);
exit(EXIT_SUCCESS);
}
return 0;
}
```
在这个示例程序中,父进程和子进程都连接到了同一个共享内存区域,使用互斥量来实现对共享内存的互斥访问。首先创建共享内存和互斥量,然后创建子进程。子进程先连接共享内存,然后等待互斥量,之后向共享内存写入数据,最后释放互斥量。父进程先连接共享内存,然后等待互斥量,之后从共享内存读取数据,最后释放互斥量。父进程和子进程断开共享内存连接后,再删除共享内存和互斥量。
阅读全文