进程通信实验代码 linux
时间: 2024-01-31 16:02:25 浏览: 26
Linux进程通信代码
以下是一个简单的 Linux 进程通信实验代码,使用了共享内存和信号量:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main()
{
int shmid, semid;
char *shmaddr;
union semun su;
struct sembuf sem_b;
// 创建共享内存
shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 附加共享内存
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) {
perror("shmat");
exit(1);
}
// 创建信号量
semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if (semid < 0) {
perror("semget");
exit(1);
}
// 初始化信号量
su.val = 0;
if (semctl(semid, 0, SETVAL, su) < 0) {
perror("semctl");
exit(1);
}
// 创建子进程
pid_t pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子进程
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = 0;
if (semop(semid, &sem_b, 1) < 0) {
perror("semop");
exit(1);
}
printf("Child process received: %s\n", shmaddr);
exit(0);
} else {
// 父进程
printf("Please input a string: ");
fgets(shmaddr, SHM_SIZE, stdin);
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = 0;
if (semop(semid, &sem_b, 1) < 0) {
perror("semop");
exit(1);
}
wait(NULL);
}
// 删除共享内存和信号量
if (shmdt(shmaddr) < 0) {
perror("shmdt");
exit(1);
}
if (shmctl(shmid, IPC_RMID, 0) < 0) {
perror("shmctl");
exit(1);
}
if (semctl(semid, 0, IPC_RMID, su) < 0) {
perror("semctl");
exit(1);
}
return 0;
}
```
这个程序创建了一个共享内存和一个信号量,然后创建了一个子进程。父进程从标准输入中读取一个字符串,写入共享内存中,并发送信号量通知子进程。子进程接收到信号量后,从共享内存中读取字符串并打印出来。最后删除共享内存和信号量。
阅读全文