gpt4 book ai didi

C++ apt-get 处理 popen 的标准输出

转载 作者:太空宇宙 更新时间:2023-11-04 14:23:34 24 4
gpt4 key购买 nike

这听起来像是一个愚蠢的问题,我是 C++ 的新手。

在 debian 上,我尝试使用 popen 调用 apt-get install。我需要解析这个程序的输出。不幸的是,我无法阅读 apt-get 的完整输出。

在某些时候 apt-get 可能会要求用户输入(询问是否应该安装依赖项)。我的程序无法输出这一行。

为什么最后一行(见下面的例子,我的程序中缺少的行是:“Do you want to continue [Y/n]?”)没有输出?

当我手动运行 apt-get 命令时,控制台输出如下所示:

$ sudo apt-get install python-wxtools
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
python-wxgtk2.8 python-wxversion
Suggested packages:
wx2.8-doc wx2.8-examples ruby wish tk8.5 tcsh csh octave3.0 mksh pdksh
python-xml editra
The following NEW packages will be installed:
python-wxgtk2.8 python-wxtools python-wxversion
0 upgraded, 3 newly installed, 0 to remove and 8 not upgraded.
Need to get 5,942kB of archives.
After this operation, 25.0MB of additional disk space will be used.
Do you want to continue [Y/n]?

注意:最后一行末尾没有换行符。

当我使用自己的程序时,最后一行丢失(输出)

$ sudo ./test/popen 
g++ -Wall -o test/popen test/popen.cpp
test/popen.cpp: In function ‘int main(int, char**, char**)’:
test/popen.cpp:22: warning: comparison between signed and unsigned integer expressions
apt-get install python-wxtools
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
python-wxgtk2.8 python-wxversion
Suggested packages:
wx2.8-doc wx2.8-examples ruby wish tk8.5 tcsh csh octave3.0 mksh pdksh
python-xml editra
The following NEW packages will be installed:
python-wxgtk2.8 python-wxtools python-wxversion
0 upgraded, 3 newly installed, 0 to remove and 8 not upgraded.
Need to get 5,942kB of archives.
After this operation, 25.0MB of additional disk space will be used.

注意:输出末尾换行

我的 popen 引用实现在 C++ 中看起来像这样:

// $Id: popen.cpp 126 2011-04-25 18:48:02Z wus $

#include <iostream>
#include <stdio.h>

using namespace std;

/**
* run debians apt-get and check output
*/
int main(int argc, char **argv, char **envp) {

FILE *fp;
char buffer[9];
// must use a package which asks for dependencies
char command[255] = "apt-get install python-wxtools";
cout << command << endl;

// Execute command, open /dev/stdout for reading
fp = popen(command, "r");

// read output character by character
while (fread(buffer, 1, 1, fp) != EOF) {
cout << buffer;
}

// close
pclose(fp);
}

我尝试在 Linux 系统上这样做

$ uname -a
Linux shell1 2.6.35-28-server #50-Ubuntu SMP Fri Mar 18 18:59:25 UTC 2011 x86_64 GNU/Linux

$ gcc --version
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

最佳答案

尝试将 -y 选项添加到 apt-get。这将使它假设用户对所有事情都说"is",这应该使它“正常工作”。我认为它现在失败了,因为它想提示用户,但它意识到没有可用的键盘输入(可能通过调用 isatty(3))所以它放弃了。

关于C++ apt-get 处理 popen 的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com