编写两个进程,一个负责输入两个整数,一个输出最小公倍数,linux下用c怎么写
时间: 2024-10-20 09:05:03 浏览: 17
在Linux环境下,使用C语言编写一个多进程程序,可以利用`fork()`函数创建新进程并实现两个进程之间的通信。这里是一个简单的示例,分为两个部分:父进程(计算最小公倍数)和子进程(接收输入)。我们将使用`pipe()`系统调用创建一个管道来进行进程间的通信。
首先,创建子进程(input_child.c),它将读取两个整数:
```c
#include <stdio.h>
#include <unistd.h>
int read_ints(int pipe_fd[2]) {
int num1, num2;
if (scanf("%d %d", &num1, &num2) == 2) {
close(pipe_fd[1]); // 父进程不需要这个端口了
write(pipe_fd[0], &num1, sizeof(num1));
write(pipe_fd[0], &num2, sizeof(num2));
return 0;
} else {
perror("Reading numbers failed");
return -1;
}
}
int main() {
int pipe_fds[2];
if (pipe(pipe_fds) == -1) {
perror("Pipe creation failed");
exit(EXIT_FAILURE);
}
pid_t child_pid = fork();
if (child_pid == 0) { // 子进程
close(pipe_fds[0]); // 父进程读取,子进程写入
read_ints(pipe_fds);
_exit(EXIT_SUCCESS); // 子进程退出
} else {
close(pipe_fds[1]); // 父进程写入,子进程读取
int num1, num2;
read(pipe_fds[0], &num1, sizeof(num1));
read(pipe_fds[0], &num2, sizeof(num2));
printf("Child process exited\n");
// 这里可以继续计算最小公倍数,由于例子简化,略去这部分代码
// ...
wait(NULL); // 等待子进程结束
}
return 0;
}
```
然后,创建父进程(main.c)接收数据并计算最小公倍数:
```c
#include <stdio.h>
#include <unistd.h>
// 计算最小公倍数的辅助函数,这里省略实际实现
uint64_t lcm(uint64_t a, uint64_t b);
int main() {
int pipe_fds[2];
if (pipe(pipe_fds) == -1) {
perror("Pipe creation failed");
exit(EXIT_FAILURE);
}
pid_t child_pid = fork();
if (child_pid == 0) { // 子进程已处理
_exit(EXIT_SUCCESS);
}
// 父进程操作
close(pipe_fds[1]);
int num1, num2;
read(pipe_fds[0], &num1, sizeof(num1));
read(pipe_fds[0], &num2, sizeof(num2));
printf("Parent received: %d and %d\n", num1, num2);
uint64_t result = lcm((uint64_t)num1, (uint64_t)num2);
printf("LCM of the two numbers is: %llu\n", result);
wait(NULL); // 等待子进程结束
return 0;
}
```
将这两个文件链接并编译运行,子进程会等待父进程发送数字,然后父进程计算最小公倍数并显示结果。
**相关问题**:
1. 如何在C语言中使用`fork()`和`pipe()`创建子进程?
2. `wait()`函数在这里的作用是什么?
3. 如果要改进这个程序,如何避免阻塞在`read()`上直到有数据可用?
阅读全文