popen으로 깔끔하게 해결할 수 있다.
char* cmd="uname";
FILE* fp=popen(cmd,"r");
if(fp==NULL)return;
std::string buffer;
char c;
while(fread(&c,1,1,fp)==1 && c!=EOF) {
buffer.push_back(c);
}
std::cout << buffer << std::endl;
pclose(fp);
buffer overflow 를 유의해야 하므로, 미리 버퍼의 크기를 구하면 좋겠지만 이건 파일이 아니므로 구할 수 없다. (ftell함수가 동작안함)
하나씩 읽어 EOF가 나올때 까지 읽는 수 밖에 없고 rewind
와 같은 함수로 돌아갈수도 없다.
호출하는 프로세스의 반환값을 알고 싶다면 아래의 매크로를 이용하여 구할 수 있다.
int ret=WEXITSTATUS(pclose(fp));
http://channelofchaos.tistory.com/55
https://stackoverflow.com/questions/22245237/execlp-redirect-stdin-in-c
https://stackoverflow.com/questions/6493674/redirecting-the-execlp-output-to-a-file