在 C 语言中,管道是一种用于进程间通信的机制,它允许一个进程与另一个进程之间传递数据。以下是与管道相关的主要函数及其用法,包括 pipe
、popen
、pclose
和 dup2
函数。
1. pipe 函数
pipe
函数用于创建一个无名管道。无名管道是单向的,可以在父子进程之间传递数据。
函数原型
int pipe(int pipefd[2]);
参数说明
pipefd:一个包含两个整数的数组。pipefd[0] 是管道的读取端,pipefd[1] 是管道的写入端。
返回值
成功时返回 0,失败时返回 -1,并设置 errno。
#include <stdio.h>
#include <unistd.h>
int main() {
int pipefd[2];
char buffer[128];
// 创建管道
if (pipe(pipefd) == -1) {
perror("pipe");
return 1;
}
// 向管道写入数据
write(pipefd[1], "Hello, world!\n", 14);
// 从管道读取数据
read(pipefd[0], buffer, sizeof(buffer));
printf("Read from pipe: %s", buffer);
// 关闭管道
close(pipefd[0]);
close(pipefd[1]);
return 0;
}
2. popen 和 pclose 函数
popen
和 pclose
函数用于打开一个管道,执行一个命令,并捕获命令的输出或为命令提供输入。
popen 函数原型
FILE *popen(const char *command, const char *type);
参数说明
command:要执行的命令。
type:指定管道的操作模式,"r" 用于读取命令输出,"w" 用于向命令写入数据。
pclose 函数原型
int pclose(FILE *stream);
示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
char buffer[128];
FILE *pipe = popen("ls -l", "r");
if (!pipe) {
perror("popen");
return 1;
}
// 读取命令的输出
while (fgets(buffer, sizeof(buffer), pipe) != NULL) {
printf("%s", buffer);
}
// 关闭管道
int ret = pclose(pipe);
if (ret == -1) {
perror("pclose");
return 1;
}
printf("Command exited with status %d\n", WEXITSTATUS(ret));
return 0;
}
3. dup2 函数
dup2 函数用于将一个文件描述符复制到另一个文件描述符上,可以重定向标准输入或标准输出。
函数原型
int dup2(int oldfd, int newfd);
参数说明
oldfd:要复制的文件描述符。
newfd:要将 oldfd 复制到的文件描述符。
示例
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open");
return 1;
}
// 将标准输出重定向到文件
dup2(fd, STDOUT_FILENO);
// 此时 printf 的输出将被写入到 output.txt 中
printf("This text is written to output.txt\n");
close(fd);
return 0;
}
4. pipe 和 fork 结合使用
pipe 和 fork 函数可以结合使用来创建父子进程之间的通信。例如,父进程可以向管道写入数据,而子进程可以从管道读取数据。
示例
#include <stdio.h>
#include <unistd.h>
int main() {
int pipefd[2];
char buffer[128];
pid_t pid;
if (pipe(pipefd) == -1) {
perror("pipe");
return 1;
}
pid = fork();
if (pid == -1) {
perror("fork");
return 1;
}
if (pid == 0) { // 子进程
close(pipefd[1]); // 关闭写端
read(pipefd[0], buffer, sizeof(buffer));
printf("Child read: %s", buffer);
close(pipefd[0]);
} else { // 父进程
close(pipefd[0]); // 关闭读端
write(pipefd[1], "Hello from parent!\n", 19);
close(pipefd[1]);
}
return 0;
}
总结
这些函数提供了在 C 语言中进行进程间通信的强大工具,尤其是对于需要父子进程协同工作的应用场景。这些函数在实际开发中非常有用,例如处理数据流、执行系统命令并捕获输出等。
标签:函数,int,pipefd,pipe,buffer,管道,语言 From: https://www.cnblogs.com/wingfeng/p/18384219