使用C语言两个进程以及信号量,一个进程A连续打印奇数(1,3,5,7,9.....),另一个进程B连续打印偶数(2,4,6,8,......) 要求最终的输出结果是有序的 (1,2,3,4,5,6,7,8,9,.....)
时间: 2023-09-24 09:03:06 浏览: 77
要实现有序的输出结果,你可以使用信号量来进行进程间的同步。下面是一个示例代码,使用C语言、两个进程和信号量来实现连续打印奇数和偶数,并保持有序的输出结果。
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <semaphore.h>
sem_t sem; // 定义信号量
void print_odd_numbers() {
int num = 1;
while (1) {
sem_wait(&sem); // 等待信号量
printf("%d ", num);
fflush(stdout);
num += 2;
sem_post(&sem); // 发送信号量
sleep(1); // 等待1秒
}
}
void print_even_numbers() {
int num = 2;
while (1) {
sem_wait(&sem); // 等待信号量
printf("%d ", num);
fflush(stdout);
num += 2;
sem_post(&sem); // 发送信号量
sleep(1); // 等待1秒
}
}
int main() {
sem_init(&sem, 0, 1); // 初始化信号量
// 创建进程A
pid_t pidA = fork();
if (pidA == 0) {
// 子进程A中打印奇数
print_odd_numbers();
}
// 创建进程B
pid_t pidB = fork();
if (pidB == 0) {
// 子进程B中打印偶数
print_even_numbers();
}
// 等待子进程结束
waitpid(pidA, NULL, 0);
waitpid(pidB, NULL, 0);
sem_destroy(&sem); // 销毁信号量
return 0;
}
```
在上述代码中,我们使用`sem_t`类型定义了一个信号量变量`sem`。在`print_odd_numbers()`和`print_even_numbers()`函数中,我们使用`sem_wait(&sem)`来等待信号量,确保每个进程打印数字之前都会等待。然后,我们使用`printf()`打印数字,然后使用`sem_post(&sem)`来发送信号量,允许另一个进程打印数字。这样,两个进程会交替打印奇数和偶数,并且最终的输出结果是有序的。
需要注意的是,我们在主函数中使用`sem_init(&sem, 0, 1)`来初始化信号量。第一个参数表示要初始化的信号量对象,第二个参数设置为0表示该信号量在线程间共享,第三个参数表示信号量的初始值为1。在主函数的最后,我们使用`sem_destroy(&sem)`来销毁信号量对象。
阅读全文