#include #include #include #include #include typedef struct data { int data; int flag; } Data; int main() { key_t key = ftok("/", 28); int shmid = shmget(key, sizeof(Data), IPC_CREAT | 0666); if (shmid == -1) { perror("shmget"); return 1; } if (fork() == 0) // 生产者进程 { Data *data = shmat(shmid, NULL, 0); if (data == (Data *)-1) { perror("shmat"); return 1; } data->flag = 0; // 初始化为 0 data->data = 0; // 初始化为 0 for (int i = 0; i < 100; i++) { // 等待消费者消费数据 while (data->flag == 1) ; data->data++; // 生产数据 data->flag = 1; printf("生产者生产数据:%d\n", data->data); } // 解除映射 if (shmdt(data) == -1) { perror("shmdt"); return 1; } _exit(0); // 子进程退出 } if (fork() == 0) // 消费者进程 { Data *data = shmat(shmid, NULL, 0); if (data == (Data *)-1) { perror("shmat"); return 1; } data->flag = 0; // 初始化为 0 data->data = 0; // 初始化为 0 for (int i = 0; i < 100; i++) { // 等待生产者生产数据 while (data->flag == 0) { printf("等待生产者生产数据\n"); } printf("消费者消费数据:%d\n", data->data); // 消费到 100 时退出 if (data->data == 10) break; sleep(1); data->flag = 0; } // 解除映射 if (shmdt(data) == -1) { perror("shmdt"); return 1; } _exit(0); // 子进程退出 } while (1) { // WUNTRACED 不跟踪 ? int pid = waitpid(0, NULL, WUNTRACED); if (pid == -1) { break; } printf("%d 子进程结束\n", pid); } // 删除共享内存 if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl"); return 1; } return 0; }