Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fgets returning error for FILE returned by popen

Tags:

c

popen

fgets

I'm trying to execute a command line from my C code, but when I get to the fgets() function, I got a NULL error.

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);
}

And my command is:

java -jar <parameters>

Why do I have a NULL result from fgets, despite that when I try to execute the same command in a terminal, it works as expected.

like image 666
TheForbidden Avatar asked Oct 05 '22 11:10

TheForbidden


1 Answers

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.

In short, the popen() is doing a fork() and you're trying to read from the pipe before the program evoked by cmd has produced output, therefor there is no data on the pipe and the first read on the pipe will return EOF, so fgets() returns without getting data. You either need to sleep, do a poll or do a blocking read.

like image 122
K Scott Piel Avatar answered Oct 07 '22 01:10

K Scott Piel