C语言写出使用fork();创建子进程并使用信号量阻塞子进程等待父进程发送信号量的代码
时间: 2024-04-22 10:28:04 浏览: 166
举例讲解C语言的fork()函数创建子进程的用法
以下是使用C语言编写的使用fork()创建子进程并使用信号量阻塞子进程等待父进程发送信号量的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/sem.h>
#include <sys/ipc.h>
// 定义全局变量,用于标识信号量
int sem_id;
// 定义信号量操作函数
void sem_operation(int sem_id, int op) {
struct sembuf sem_b;
sem_b.sem_num = 0; // 信号量集中的第一个信号量
sem_b.sem_op = op; // 信号量操作数
sem_b.sem_flg = 0;
semop(sem_id, &sem_b, 1);
}
int main() {
// 创建信号量集,包含一个信号量
key_t key = ftok(".", 's');
sem_id = semget(key, 1, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("Failed to create semaphore");
exit(1);
}
// 初始化信号量值为0
sem_operation(sem_id, 0);
// 创建子进程
pid_t pid = fork();
if (pid == -1) {
perror("Failed to fork");
exit(1);
} else if (pid == 0) {
// 子进程
printf("Child process waiting for semaphore...\n");
// 阻塞等待父进程发送信号量
sem_operation(sem_id, -1);
printf("Child process received semaphore.\n");
} else {
// 父进程
sleep(1); // 等待子进程输出等待信息
printf("Parent process sending semaphore...\n");
// 发送信号量给子进程
sem_operation(sem_id, 1);
wait(NULL); // 等待子进程退出
printf("Parent process received semaphore.\n");
}
// 删除信号量集
semctl(sem_id, 0, IPC_RMID);
return 0;
}
```
以上代码使用fork()函数创建子进程,然后使用信号量实现了子进程等待父进程发送信号量的功能。父进程先睡眠一秒,然后发送信号量给子进程,子进程接收到信号量后继续执行。注意,代码中使用了系统调用函数semget()、semop()和semctl()来进行信号量的创建、操作和删除。
阅读全文