利用shmget()创建共享内存; 利用shmat()建立共享内存与进程之间的关联; 用fork()创建子进程,子进程与父进程共享存储空间; 利用信号量机制实现子进程读入数据到共享内存,父进程取出共享内存中的数据保存到文件,完成通信; 调用shmdt()断开共享内存连接; 调用shmctl()释放共享内存; 有注释,能在ubuntu上运行
时间: 2024-03-25 07:41:52 浏览: 62
感谢您的提问。这是一个关于共享内存和进程间通信的问题。
以下是一个基于Linux系统的共享内存与进程通信的示例程序,可在Ubuntu上运行。注意:代码中的注释是中文的。
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUF_SIZE 1024
// 定义信号量
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
void sem_p(int semid) {
struct sembuf sops = {0, -1, SEM_UNDO};
semop(semid, &sops, 1);
}
void sem_v(int semid) {
struct sembuf sops = {0, 1, SEM_UNDO};
semop(semid, &sops, 1);
}
int main(int argc, char *argv[]) {
int shmid, semid;
key_t key;
char *shm_ptr;
char buf[BUF_SIZE];
pid_t pid;
// 创建共享内存的key
if ((key = ftok(".", 'a')) == -1) {
perror("ftok error");
exit(1);
}
// 创建共享内存
if ((shmid = shmget(key, BUF_SIZE, IPC_CREAT|0666)) == -1) {
perror("shmget error");
exit(1);
}
// 关联共享内存
if ((shm_ptr = (char *)shmat(shmid, 0, 0)) == (void *)-1) {
perror("shmat error");
exit(1);
}
// 创建信号量
if ((semid = semget(key, 1, IPC_CREAT|0666)) == -1) {
perror("semget error");
exit(1);
}
// 初始化信号量
union semun sem_union;
sem_union.val = 1;
if (semctl(semid, 0, SETVAL, sem_union) == -1) {
perror("semctl error");
exit(1);
}
// 创建子进程
pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid == 0) { // 子进程
// 写入数据到共享内存
sem_p(semid); // P操作,锁住信号量
sprintf(shm_ptr, "Hello, parent process!");
sem_v(semid); // V操作,解锁信号量
exit(0);
} else { // 父进程
// 从共享内存中读取数据
sem_p(semid); // P操作,锁住信号量
memset(buf, 0, BUF_SIZE);
strncpy(buf, shm_ptr, strlen(shm_ptr));
sem_v(semid); // V操作,解锁信号量
// 保存数据到文件
int fd;
if ((fd = open("output.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1) {
perror("open error");
exit(1);
}
write(fd, buf, strlen(buf));
close(fd);
// 断开共享内存连接
if (shmdt(shm_ptr) == -1) {
perror("shmdt error");
exit(1);
}
// 释放共享内存
if (shmctl(shmid, IPC_RMID, 0) == -1) {
perror("shmctl error");
exit(1);
}
}
return 0;
}
```
以上代码演示了如何使用共享内存和信号量实现进程间通信。在代码中,父进程创建共享内存和信号量,然后创建子进程。子进程将数据写入共享内存,并通过信号量锁住共享内存,以防止其他进程访问。父进程从共享内存中读取数据,保存到文件中,并释放共享内存和信号量。
希望这个示例程序能够帮助到您。如果您有任何问题,请随时提出。
阅读全文