fgets возвращающая ошибка для FILE, возвращенная popen

Я пытаюсь выполнить командную строку из моего кода на C, но когда я перейду к функции fgets (), я получил ошибку NULL.

void executeCommand(char* cmd, char* output) { FILE *fcommand; char command_result[1000]; fcommand = popen(cmd, "r"); if (fcommand == NULL) { printf("Fail: %s\n", cmd); } else { if (fgets(command_result, (sizeof(command_result)-1), fcommand) == NULL) printf("Error !"); strcpy(output, command_result); } pclose(fcommand); } 

И моя команда:

 java -jar  

Почему у меня есть результат NULL из fgets, несмотря на это, когда я пытаюсь выполнить ту же команду в терминале, он работает так, как ожидалось.

fgets () читает не более одного символа размера из streamа и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. A ‘\ 0’ сохраняется после последнего символа в буфере.

Короче говоря, popen() делает fork() и вы пытаетесь прочитать из канала до того, как программа, вызванная cmd , произвела выход, поэтому на трубе нет данных, и первое чтение на трубе вернется EOF , поэтому fgets() возвращается без получения данных. Вам либо нужно спать, либо делать опрос, либо читать блокировку.