I am having trouble using system() from libc on Linux. My code is this:
system( "tar zxvOf some.tar.gz fileToExtract | sed 's/some text to remove//' > output" );
std::string line;
int count = 0;
std::ifstream inputFile( "output" );
while( std::getline( input, line != NULL ) )
++count;
I run this snippet repeatedly and occasionally I find that count == 0 at the end of the run – no lines have been read from the file. I look at the file system and the file has the contents I would expect (greater than zero lines).
My question is should system() return when the entire command passed in has completed or does the presence of the pipe ‘|’ mean system() can return before the part of the command after the pipe is completed?
I have explicitly not used a ‘&’ to background any part of the command to system().
To further clarify I do in practice run the code snippet multiples times in parallel but the output file is a unique filename named after the thread ID and a static integer incremented per call to system(). I’m confident that the file being output to and read is unique for each call to system().
According to the documentation
Perhaps capture the output of “output” when it fails and see what it is? In addition, checking the return value of
systemwould be a good idea. One scenario is that the shell command you are running is failing and you aren’t checking the return value.