- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Edit2:仔细想想,这可能是一个更好的问题:
如果我使用 popen 写入 sysfs 文件,它会阻塞直到写入完成,但不会等待 sysfs 文件完成处理。我如何等待 sysfs 文件执行它正在执行的操作?
我想在程序中运行命令,等待它完成(这将需要几秒钟)并将终端输出返回给我,而不将其打印到控制台。
通过阅读其他问题,我发现可以使用 system()
或 exec()
调用来运行命令。但是,这些不会为您提供终端的输出,因此您需要执行一些笨重的操作,例如写入文件,然后打开并读取该文件,然后将其删除。
我见过的另一个选项是popen()
,它提供了一个文件描述符,您可以使用它来获取终端输出。然而,这似乎并没有等待命令完成,这导致我的程序有点搞砸了。
那么如何才能获得 popen 的功能,同时强制它等待子进程完成后再执行其他操作?
编辑:这是我目前正在做的事情:
#include <stdio.h>
int main(){
FILE *file;
char terminal[512];
sprintf(terminal,"/bin/cat /home/Config/BASE_SETTINGS.bin > /sys/bus/iio/devices/iio\:device3/profile_config");
if(!(file=popen(terminal,"r"))){return -1;}
while(fgets(terminal,sizeof(terminal),file)!=NULL){
printf("%s\n", terminal);
}
pclose(file);
}
这是程序的一部分,我多次执行相同的操作,只是每次更改“sprintf”中的命令。据我所知, pclose 应该被阻止。但是,当我从终端运行命令时,写入 sysfs 文件后需要几秒钟才能完成配置。但是,当我通过程序执行此操作时,程序运行时间不到一秒。
因为我的程序中的后面的命令依赖于正在配置的 sysfs 驱动程序,并且它似乎在 sysfs 进程完成之前转到后面的命令,所以后面的命令失败,因为它们最终在配置完成之前运行.
最佳答案
pclose() 和 _pclose()(在 Windows 上)将阻塞,直到子进程执行完成。要获得输出,只需使用 FILE 指针打开它们并使用 fgets 读取它们。请参阅下面的示例(适用于 win32 和 unix 系统):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(_WIN32)
#include <Windows.h>
#else
#include <unistd.h>
#endif
#ifndef PATH_MAX
#define PATH_MAX 255 //Usually defined in <Windows.h>
#endif
FILE *popenHandler(const char *args, const char *method)
{
#if defined(_WIN32)
return _popen(args, method);
#else
return popen(args, method);
#endif
}
int pcloseHandler(FILE *fp)
{
#if defined(_WIN32)
return _pclose(fp);
#else
return pclose(fp);
#endif
}
int main()
{
FILE *fp; //file pointer to point to command
char path[PATH_MAX]; //char buffer to store output
#if defined(_WIN32)
char command[PATH_MAX] = "dir"; //command to execute
#else
char command[PATH_MAX] = "ls -l"; //command to execute
#endif
//If you want to include stderr in the results, uncomment the below string
//strncpy(command, " 2>&1", PATH_MAX); //Merges stderror with stdout
fp = popenHandler(command, "r"); //function to work on win32 or unix
if (fp == NULL) {
printf("ERROR: Failed to execute command %s\n", command);
return -1;
}
int lineNumber = 0;
while (fgets(path, PATH_MAX, fp) != NULL) {
printf("Line #%i of output from command: %s\n", lineNumber++, path);
}
int returnValue = pcloseHandler(fp); //Make sure to close!
printf("The sub-process returned %i\n", returnValue);
}
关于组合 system() 和 popen()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946102/
我正在使用java引擎来处理一些内容。 我想知道这样会占用不必要的资源吗? command = 'some command to run my jar file' p = subprocess.Pop
我正在尝试使用以下代码块将一个进程的输出作为输入发送到另一个进程: p1 = Popen(command, stdout=PIPE) p2 = Popen(dgxmcmd, stdin=p1.stdo
popen 缓冲输出而系统没有。这是唯一的区别吗? 我知道 popen 和 system 都通过 shell 运行命令。但是,popen() 是否为 evil作为系统()? 最佳答案 看,从本质上讲,
用代码最容易解释: require 'timeout' puts "this block will properly kill the sleep after a second" IO.popen("
似乎既执行子进程又创建管道进行输入/输出,只是 subprocess 较新。 我的问题是,有没有subprocess.Popen可以做而os.popen不能做的功能,所以我们需要新模块subproce
我有一个生成以下输出的程序: ┌───────────────────────┐ │10 day weather forecast│
我正在使用以下命令来运行 shell 命令(创建子进程): cmd = "ls" process = subprocess.Popen(cmd, shell=True, stdout=subproce
得到结果后,我需要停止通过Python中的Popen发出的服务(在另一个线程的后台运行),但是以下方法失败了(只是使用ping)解释): class sample(threading.Thread):
Python - os.popen 和 subprocess.Popen 有什么区别? 最佳答案 os 进程功能被认为已过时。 subprocess 模块是在 Python 2.4 中引入的,作为与子
根据 python 文档 http://docs.python.org/library/subprocess.html ,建议将 os.popen 替换为 Popen 类,现在我有以下命令: impo
非常具体的问题(我希望):以下三个代码有什么区别? (我希望它只是第一个不等待子进程完成,而第二个和第三个会这样做。但我需要确定这是 only 的区别...) 我也欢迎其他评论/建议(尽管我已经很清楚
我有以下代码: pwd = '/home/user/svnexport/Repo/' updateSVN = "svn up " + pwd cmd = os.popen(updateSVN) get
我正在尝试编写简单的 c 函数,这将使我有可能看到从一个流到另一个流的数据传输进度,并将其显示在我的字符 LCD 上。 我设法传输数据并指示进度,但如何获得管道的结果? 所以基本上我想在 c 中做对应
我正在尝试使用 subprocess 模块与使用 Python 的命令行聊天机器人进行通信。 (http://howie.sourceforge.net/使用编译后的 win32 二进制文件,我有我的
我需要为 Ghostscript 创建一个 Monkey 补丁,我必须从 os.popen 迁移到 subsession.popen 因为我不能在我的系统中使用 shell . 我这样试过: def
在 Linux 操作系统上,下面的 python 代码提供了当前目录中的目录。 dirs = os.popen('ls -d */').read().split(os.linesep) print d
当我们从 Python 2.7.3 升级到 Python 2.7.5 时,大量使用 subprocess.Popen() 的内部库的自动化测试开始失败。该库用于线程环境。调试问题后,我能够创建一个简短
我无法得到它与 bash 相关或 python 子进程,但结果不同: >>> subprocess.Popen("echo $HOME", shell=True, stdout=subprocess.
这里我想执行一个命令,我必须在执行第一个命令后给这个命令输入。 我想执行 obex_test蓝牙模式命令而不是在我必须为启动服务器提供像's'这样的输入之后我怎么能给这个东西。这是我的代码,我写了这个
在我的 Lua 程序中,我必须捕获来自外部程序的输出。这个外部程序需要某些环境变量。所以我这样做: e = "" e = e .. "A=100;" e = e .. "B=Hi;" e = e ..
我是一名优秀的程序员,十分优秀!