进程通信实验代码 linux
时间: 2023-09-12 10:09:57 浏览: 71
Linux进程通信代码
进程间通信是操作系统中非常重要的一个概念,常用的进程间通信方式包括管道、共享内存、消息队列和信号量等。下面是一个简单的 Linux 进程通信实验代码,使用了共享内存和信号量。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
// 定义信号量结构体
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
// 函数声明
void P(int semid, int semnum);
void V(int semid, int semnum);
int main() {
int shmid, semid, pid;
char *shmaddr;
union semun sem_arg;
// 创建共享内存
shmid = shmget(IPC_PRIVATE, SHM_SIZE, 0666 | IPC_CREAT);
if (shmid == -1) {
perror("shmget error");
exit(1);
}
// 分配共享内存
shmaddr = (char *) shmat(shmid, NULL, 0);
if (shmaddr == (void *) -1) {
perror("shmat error");
exit(1);
}
// 创建信号量
semid = semget(IPC_PRIVATE, 2, 0666 | IPC_CREAT);
if (semid == -1) {
perror("semget error");
exit(1);
}
// 初始化信号量
sem_arg.val = 1;
if (semctl(semid, 0, SETVAL, sem_arg) == -1) {
perror("semctl error");
exit(1);
}
sem_arg.val = 0;
if (semctl(semid, 1, SETVAL, sem_arg) == -1) {
perror("semctl error");
exit(1);
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork error");
exit(1);
} else if (pid == 0) { // 子进程
char *msg = "hello world\n";
// P 操作
P(semid, 0);
// 写入共享内存
sprintf(shmaddr, "%s", msg);
// V 操作
V(semid, 1);
} else { // 父进程
// P 操作
P(semid, 1);
// 读取共享内存
printf("Message: %s", shmaddr);
// V 操作
V(semid, 0);
// 等待子进程结束
wait(NULL);
}
// 删除共享内存和信号量
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl error");
}
if (semctl(semid, 0, IPC_RMID, sem_arg) == -1) {
perror("semctl error");
}
return 0;
}
// P 操作
void P(int semid, int semnum) {
struct sembuf sem_arg;
sem_arg.sem_num = semnum;
sem_arg.sem_op = -1;
sem_arg.sem_flg = SEM_UNDO;
if (semop(semid, &sem_arg, 1) == -1) {
perror("semop error");
exit(1);
}
}
// V 操作
void V(int semid, int semnum) {
struct sembuf sem_arg;
sem_arg.sem_num = semnum;
sem_arg.sem_op = 1;
sem_arg.sem_flg = SEM_UNDO;
if (semop(semid, &sem_arg, 1) == -1) {
perror("semop error");
exit(1);
}
}
```
该代码创建了一个共享内存和两个信号量,父进程和子进程分别对共享内存进行读写操作。其中,P 和 V 分别是信号量的 P 操作和 V 操作,用于实现进程间的同步。具体实现方法可以参考代码中的注释。
阅读全文