c - 如何控制 popen() 创建的管道?
问题描述
注意:我知道我可以通过使用来实现我所描述的fork
,也许wait
但我想了解它是如何popen
工作的以及如何使用它在进程之间进行通信。
我想使用popen
创建一个子进程,然后在子进程中写入由创建的管道popen
,然后在父进程中,我从管道中读取并输出消息。
这是我尝试过的:
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#define BUFFER_SIZE 105
int main(int argc, const char * argv[])
{
FILE* fp;
int status;
char buffer[BUFFER_SIZE];
fp = popen("date", "r"); // returns `FILE *` object (the same as a "stream", I think)
if(fp == NULL) { printf("Eroare la deschidere cu `popen()`\n");} return -1; // or `EXIT_FAILURE`
fgets(buffer, BUFFER_SIZE, fp); // ????? is this where I am reading from the pipe?
// `popen` returns a pointer to a stream, thus is it a `FILE *` object?
// As such, is `fp` also the pipe? "pipe" == "stream" == `FILE *` object ?
printf("I have read: %s", buffer);
status = pclose(fp);
if(status == -1) { printf("`Eroare la inchiderea cu popen()`\n"); return -1;} // or `EXIT_FAILURE`
return 0; // or `EXIT_SUCCESS`?
}
另外,在这种情况下,哪个是管道?fp
既是对象又是FILE *
“管道”?我可以访问fp[0]
&fp[1]
吗?
输出:
I have read: Thu Apr 30 16:29:05 EEST 2020
解决方案
我不完全清楚你在这里问什么,所以让我知道这个答案是否错过了标记。
man popen
确认 popen 返回一个FILE *
. 它不是一个数组;没有fp[0]
或fp[1]
。
“管道”只是一对连接的文件描述符......一个在父进程中可用(这是popen的返回值),一个在子进程中可用。当您从fp
变量中读取时,您正在从管道的一端读取(并且当子进程写入stdout
它时正在写入管道的另一端)。
是从流中读取的子级还是父级
当您运行时fp = popen("date", "r")
,您正在创建一个单向管道。父母可以阅读,孩子可以写作(如果您指定"w"
为模式,则相反)。
您正在从此处的 pip 中明确读取:
fgets(buffer, BUFFER_SIZE, fp);
以及如何知道子流程执行了什么
子流程执行您告诉它的内容(在本例中为date
)。
此外,我们如何知道哪一端是读,哪一端是写
您可以使用命令的第二个参数进行popen
控制。
是 popen 的全部目的(在我的情况下,在这里)将命令的输出重定向到父进程
的目的popen
是允许子进程和父进程之间的通信。它创建一个单向管道,但您可以控制它是parent -> child
还是child -> parent
。
这是我提供的程序中发生的情况吗?1) popen 打开一个子进程 2) 子进程将 date 命令的输出写入管道的写端 3) 父进程读取管道的读端(即子进程传输的内容) ?
那是对的。
推荐阅读
- kubernetes - 如何使用每个节点运行一个并使用所有可用资源的 Pod 在 Kubernetes (GKE) 上自动扩展?
- database - 应用范围内关系的用户或用户配置文件模型
- php - 使用 mpdf 时需要设置 HTTP Header 吗?
- c# - 将函数调用作为参数传递给另一个函数时如何解构函数调用
- django-models - 如何解决 slugfield int() 问题
- python - Python填充多边形
- java - 使用 Vertx PG 客户端时出现“查询已在运行”错误
- python - 从 tensorflow 1.x 升级到 2.0
- windows - 为什么 Flutter 在 Windows 上不再被识别以及如何修复它?
- model-view-controller - MVC 控制器中的日期时间格式编辑操作