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进程完成之前似乎要转到后面的命令,后面的命令会失败,因为它们最终会在配置完成之前运行
答案 0 :(得分:0)
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);
}