编写两个进程,一个负责输入,一个输出对应的回文数,要用重定向到第三个文件,linux下用c怎么写
时间: 2024-10-20 15:14:47 浏览: 22
PHP输出两个数字中间有多少个回文数的方法
在Linux环境下,使用C语言编写两个并发进程,一个负责读取用户输入并生成回文数,另一个负责将结果输出到第三个文件,可以使用`fork()`系统调用创建子进程,并利用`pipe()`和`dup2()`函数进行通信以及标准I/O重定向。以下是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#define BUFFER_SIZE 1024
void read_and_create_palindrome(int pipe[2], char *output_file) {
int fd[2];
pid_t child_pid;
if (pipe(fd) == -1) {
perror("Pipe failed");
exit(EXIT_FAILURE);
}
child_pid = fork();
if (child_pid == 0) { // Child process
dup2(fd[0], STDIN_FILENO); // Redirect input from pipe to stdin
close(fd[1]); // Close one end of the pipe
FILE *file = fopen(output_file, "w");
if (!file) {
perror("Failed to open output file");
_exit(EXIT_FAILURE);
}
char input[BUFFER_SIZE];
while (fgets(input, sizeof(input), stdin)) {
char* reversed = reverse_string(input);
fprintf(file, "%s\n", reversed);
free(reversed);
}
fclose(file);
_exit(0);
} else if (child_pid > 0) { // Parent process
close(fd[0]); // Close reading end in parent
close(STDOUT_FILENO);
dup2(fd[1], STDOUT_FILENO); // Redirect stdout to pipe's writing end
close(fd[1]); // Close writing end in parent
printf("Please enter a number and its reverse will be written to %s.\n", output_file);
wait(NULL); // Wait for child to finish
} else {
perror("Fork failed");
exit(EXIT_FAILURE);
}
}
char* reverse_string(const char* str) {
int len = strlen(str);
char* rev_str = malloc(len + 1);
for (int i = 0; i < len; ++i) {
rev_str[len - i - 1] = str[i];
}
rev_str[len] = '\0';
return rev_str;
}
int main() {
int pipefd[2];
char output_file[] = "palindrome_output.txt";
if (pipe(pipefd) == -1) {
perror("Creating pipe failed");
exit(EXIT_FAILURE);
}
// Start reader and writer processes
pid_t reader_pid = fork();
if (reader_pid == 0) {
read_and_create_palindrome(pipefd, output_file);
} else if (reader_pid > 0) {
read_and_create_palindrome(pipefd, output_file);
} else {
perror("Forking reader failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
在这个例子中,我们首先创建一个管道和两个文件描述符。父进程启动两个子进程,一个是读者,从管道读取输入,另一个是作家,将处理后的回文输出到文件。然后,子进程通过`stdin`和`stdout`的重定向进行交互。
注意:这个示例假设了输入是整数,实际应用中需要根据输入格式进行适当的解析。此外,在生产环境中,为了更好地管理资源和避免阻塞,可以考虑使用互斥锁或其他同步机制。
阅读全文