Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Executing bash command and getting the output in C

Hello I have seen some solutions on the internet, all of them are basically creating a file, however I want to store them in an array of char. Speed is really important for me and I don't want to spend any time for working on hard drive. So popen() is not a real solution for me.

like image 525
Sarp Kaya Avatar asked Nov 20 '25 01:11

Sarp Kaya


2 Answers

Here is a working code snippet:

char bash_cmd[256] = "ls -l";
char buffer[1000];
FILE *pipe;
int len; 

pipe = popen(bash_cmd, "r");

if (NULL == pipe) {
    perror("pipe");
    exit(1);
} 

fgets(buffer, sizeof(buffer), pipe);

len = strlen(buffer);
buffer[len-1] = '\0'; 

pclose(pipe);
like image 151
Oleksandr Kravchuk Avatar answered Nov 21 '25 14:11

Oleksandr Kravchuk


If you would read the manpage of popen, you would notice the following:

The popen() function opens a process by creating a pipe, forking, and invoking the shell. [...] The return value from popen() is a normal standard I/O stream in all respects save that it must be closed with pclose() rather than fclose(3). [...] reading from a "popened" stream reads the command's standard output, and the command's standard input is the same as that of the process that called popen().

(emphasis mine)

As you can see, a call to popen results in the stdout of the command being piped into your program through an I/O stream, which has nothing to do with disk I/O at all, but rather with interprocess communication managed by the operating system.

(As a sidenote: It's generally a good idea to rely on the basic functionality of the operating system, within reason, to solve common problems. And since popen is part of POSIX.1-2001 you can rely on it to be available on all standards compliant operarting systems, even windows)

EDIT: if you want to know more, read this: http://linux.die.net/man/3/popen

like image 30
Andreas Grapentin Avatar answered Nov 21 '25 14:11

Andreas Grapentin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!