linux用C语言实现<>重定向允许用户使用管道操作符“|”来同时执行两个进程,并把第一个进程的stdout重定向为第二个进程的stdin
时间: 2024-02-06 12:09:34 浏览: 239
实现该功能需要使用 Linux 的进程间通信机制——管道(pipe),以及文件描述符的重定向。
首先,使用 pipe() 函数创建一个管道,该函数会返回两个文件描述符,一个表示管道的读端,一个表示管道的写端。然后,使用 fork() 函数创建两个子进程,一个用来执行第一个进程,另一个用来执行第二个进程。在第一个子进程中,将标准输出重定向到管道的写端,然后使用 exec() 函数执行第一个进程。在第二个子进程中,将标准输入重定向到管道的读端,然后使用 exec() 函数执行第二个进程。最后,在父进程中关闭管道两端的文件描述符。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int fd[2];
pid_t pid1, pid2;
if (argc != 3) {
printf("Usage: %s <command1> <command2>\n", argv[0]);
exit(1);
}
if (pipe(fd) < 0) {
perror("pipe error");
exit(1);
}
if ((pid1 = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid1 == 0) {
// Child process 1
close(fd[0]); // Close the read end of the pipe
dup2(fd[1], STDOUT_FILENO); // Redirect stdout to the write end of the pipe
close(fd[1]); // Close the write end of the pipe
execlp(argv[1], argv[1], NULL); // Execute the first command
perror("exec error");
exit(1);
}
if ((pid2 = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid2 == 0) {
// Child process 2
close(fd[1]); // Close the write end of the pipe
dup2(fd[0], STDIN_FILENO); // Redirect stdin to the read end of the pipe
close(fd[0]); // Close the read end of the pipe
execlp(argv[2], argv[2], NULL); // Execute the second command
perror("exec error");
exit(1);
}
// Parent process
close(fd[0]); // Close the read end of the pipe
close(fd[1]); // Close the write end of the pipe
waitpid(pid1, NULL, 0); // Wait for child process 1 to exit
waitpid(pid2, NULL, 0); // Wait for child process 2 to exit
return 0;
}
```
该程序的用法为:
```
./program_name command1 command2
```
其中,command1 和 command2 分别为需要执行的两个命令。该程序会先执行 command1,并将其标准输出重定向到管道的写端,然后执行 command2,并将其标准输入重定向到管道的读端。两个命令会同时执行,并且 command1 的输出会作为 command2 的输入。
阅读全文