Edit2:考虑一下,这可能是一个更好的问题:

如果我使用popen写入sysfs文件,它将阻塞直到写入完成,但不要等待sysfs文件完成处理。我怎样才能等待该sysfs文件执行所有操作?

我想在程序中运行命令,等待它完成(这将需要几秒钟),然后将终端输出返回给我,而无需将其打印到控制台。

通过阅读其他问题,我已经看到system()exec()调用可用于运行命令。但是,这些没有给您终端的输出,因此您需要执行一些笨拙的操作,例如写入文件,然后打开并读取该文件,然后将其删除。

我看到的另一个选项是popen(),它提供了可用于获取终端输出的文件描述符。但是,这似乎并不等待命令完成,这导致我的程序有点混乱。

那么,如何在强制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);
}

08-15 21:58