请将以上代码修改为可基于linux系统使用的c语言
时间: 2024-03-14 22:47:02 浏览: 17
好的,以下是使用C语言编写的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define QUEUE_SIZE 200
bool is_prime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
void worker(int *queue, int *finished, int pid) {
while (true) {
if (*finished == 1 && queue[QUEUE_SIZE] == 0) {
break;
}
int num = 0;
for (int i = 0; i < QUEUE_SIZE; i++) {
if (queue[i] != 0) {
num = queue[i];
queue[i] = 0;
break;
}
}
if (num != 0) {
if (is_prime(num)) {
printf("Process %d found a prime number: %d\n", pid, num);
}
}
else {
sleep(1);
}
}
}
int main() {
int queue[QUEUE_SIZE] = {0};
int finished = 0;
for (int i = 0; i < QUEUE_SIZE; i++) {
queue[i] = i + 1;
}
finished = 1;
pid_t pid;
for (int i = 0; i < 10; i++) {
pid = fork();
if (pid < 0) {
printf("Error: fork failed.\n");
exit(1);
}
else if (pid == 0) {
worker(queue, &finished, getpid());
exit(0);
}
}
for (int i = 0; i < 10; i++) {
wait(NULL);
}
return 0;
}
```
这个程序首先定义了一个队列和一个变量finished,与Python版本的代码类似。父进程将200个整数放入队列后,将finished置为1,子进程将不断从队列中取数并判断是否为素数,直到队列为空且finished为1。程序创建了10个子进程,每个子进程都会从队列中取数并判断是否为素数,如果是则输出进程号和这个整数。注意,子进程在每次从队列中取数之前都会判断finished是否为1并且队列是否为空,如果是,则子进程结束。