gpt4 book ai didi

组合 system() 和 popen()?

转载 作者:行者123 更新时间:2023-11-30 16:50:58 24 4
gpt4 key购买 nike

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/

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