Sponsored Content
Top Forums Programming Capture stdout from multiple processes Post 302546992 by dvales on Friday 12th of August 2011 08:31:22 PM
Old 08-12-2011
Capture stdout from multiple processes

I have a number of binaries which I currenlty have no control over. They alright data to stdout. I would like to kick off any number of these binaries and capture and process their stdout. Doing this for one process is straight forward for example - comments and error checking removed for simplicity

Code:
pid_t pid;
int	commpipe[2];
char buf[BUFSIZE];

pipe(commpipe)
 
pid=fork();

 if(pid){
    dup2(commpipe[0],0);
    close(commpipe[0]);
    while ( fgets ( buf, BUFSIZE, stdin ) )
    { processBuffer ( buf );
 } else{
    dup2(commpipe[1],1); 
   close(commpipe[0]);
    setvbuf(stdout,(char*)NULL,_IONBF,0); 
   execl("child","child",NULL) 	
}

I would run the above from a separate thread. This works fine for one process, if I attempt to repeat the above for a secoind process. the output of the 2 process is intermingled. I can solve the stdin side by not removing the dup2 call in the parent and reading directly from the read side of the pipe i.e. fgets( buf, BUFSIZE, stdin). But the data is still intermingled since it is the same stdout.
I can close stdout before forking but then I only get the output from one process.

The goal is to have a separate thread read the stdout of each process Any help will be appreciated

Thanks in advance

I'm sure there is away to do it

Last edited by zxmaus; 08-12-2011 at 11:40 PM.. Reason: added code tags
 

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

not able to capture STDOUT

I am using a third party API to get some real time feed. When I run the command it shows the results properly: etd@mhs-apps5009 $ mamalistenc -m lbm -tport mamaqa -S MLALERTS -s KANA wFinancialStatus Type CTRL-C to exit. (null).MLALERTS.KANA Type: INITIAL Status OK wFinancialStatus |... (5 Replies)
Discussion started by: aks__
5 Replies

2. UNIX for Advanced & Expert Users

How to capture STDOut of script in a CGI script?

Hi Perl Experts, I am invoking a shell script thru a perl script and the perl script is cgi script.I need to capture the STDOUT of the shell script in the html page where I am invoking the script .?The shell script takes couple of mintutes to complete its execution .Mean while my html page does... (1 Reply)
Discussion started by: kittu1979
1 Replies

3. Shell Programming and Scripting

How do I capture multiple lines of the status output of a command?

I need to know what the upload speed of an Internet connection. I thought the easiest way to do this would be to transfer a file via FTP to my server using the command: sh-3.2$ ftp -u ftp://username:password@computerdomain/directory/ file_to_be_uploaded Note: My environment allows me to issue... (2 Replies)
Discussion started by: zzz1528
2 Replies

4. UNIX for Advanced & Expert Users

Capture child processes and change return values question

Thanks in advance. My environment is Ubuntu 9.04 desktop customized to be a high school classroom server for teaching code development. I have a unique "fake" jail called "lshell" which is very easy to setup and restricts users to commands that I dictate DISALLOWING ANYTHING ELSE. These... (6 Replies)
Discussion started by: tuxhats
6 Replies

5. UNIX for Dummies Questions & Answers

Redirect stdin stdout to multiple files

Hi, i know how to a) redirect stdout and stderr to one file, b) and write to two files concurrently with same output using tee command Now, i want to do both the above together. I have a script and it should write both stdout and stderr in one file and also write the same content to... (8 Replies)
Discussion started by: ysrini
8 Replies

6. Shell Programming and Scripting

Capture values using multiple regex patterns

I have to read the file, in each line of file i need to get 2 values using more than one search pattern. ex: <0112 02:12:20 def > /some string/some string||some string||124 i donot have same delimiter in the line, I have to read '0112 02:12:20' which is timestamp, and last field '124' which is... (4 Replies)
Discussion started by: adars1
4 Replies

7. UNIX for Dummies Questions & Answers

multiple variables assignement (stdout/stderr outputs)

Hi all, I've been looking around for this for a while and can't seem to find a satifactory way to do what I want: I would like to assign the output of stdout to a variable and that of stderr to another one, and this without using temporary files/named pipes. In other words be able to assign... (4 Replies)
Discussion started by: anthalamus
4 Replies

8. Shell Programming and Scripting

grep - Extracting multiple key words from stdout

Hello. From command line, the command zypper info nxclient return a bloc of data : linux local # zypper info nxclient Loading repository data... Reading installed packages... Information for package nxclient: Repository: zypper_local Name: nxclient Version: 3.5.0-7 Arch: x86_64... (7 Replies)
Discussion started by: jcdole
7 Replies

9. UNIX for Dummies Questions & Answers

Capture Multiple Lines Into Variable As Of Standard Output

Hello All, I have the below script and output. cat test.sh #!/bin/bash -x logit() { echo " - ${*}" > ${LOG_FILE} } LOG_FILE=/home/infrmtca/bin/findtest.log VAR=`find . -type f -name "*sql"` logit $VAR Output: cat /home/infrmtca/bin/findtest.log -... (9 Replies)
Discussion started by: Ariean
9 Replies

10. Shell Programming and Scripting

Execute Multiple Scripts and Capture Log Details

Hi All, I have a requirement to execute multiple scripts (say 4) one after the other in one script and capture log details and error messages in a log file below LOG_FILE= FILE.`date ++"%Y%m%d%H:%M:%S"` Script 1 : File_Checkr.sh Script 2 : Pre_Validation.sh Script 3 : Testing.sh Script... (12 Replies)
Discussion started by: Deena1984
12 Replies
IO::CaptureOutput(3pm)					User Contributed Perl Documentation				    IO::CaptureOutput(3pm)

NAME
IO::CaptureOutput - capture STDOUT and STDERR from Perl code, subprocesses or XS VERSION
This documentation describes version 1.1102. SYNOPSIS
use IO::CaptureOutput qw(capture qxx qxy); # STDOUT and STDERR separately capture { noisy_sub(@args) } $stdout, $stderr; # STDOUT and STDERR together capture { noisy_sub(@args) } $combined, $combined; # STDOUT and STDERR from external command ($stdout, $stderr, $success) = qxx( @cmd ); # STDOUT and STDERR together from external command ($combined, $success) = qxy( @cmd ); DESCRIPTION
This module provides routines for capturing STDOUT and STDERR from perl subroutines, forked system calls (e.g. "system()", "fork()") and from XS or C modules. FUNCTIONS
The following functions will be exported on demand. capture() capture &subroutine, $stdout, $stderr; Captures everything printed to "STDOUT" and "STDERR" for the duration of &subroutine. $stdout and $stderr are optional scalars that will contain "STDOUT" and "STDERR" respectively. "capture()" uses a code prototype so the first argument can be specified directly within brackets if desired. # shorthand with prototype capture { print __PACKAGE__ } $stdout, $stderr; Returns the return value(s) of &subroutine. The sub is called in the same context as "capture()" was called e.g.: @rv = capture { wantarray } ; # returns true $rv = capture { wantarray } ; # returns defined, but not true capture { wantarray }; # void, returns undef "capture()" is able to capture output from subprocesses and C code, which traditional "tie()" methods of output capture are unable to do. Note: "capture()" will only capture output that has been written or flushed to the filehandle. If the two scalar references refer to the same scalar, then "STDERR" will be merged to "STDOUT" before capturing and the scalar will hold the combined output of both. capture &subroutine, $combined, $combined; Normally, "capture()" uses anonymous, temporary files for capturing output. If desired, specific file names may be provided instead as additional options. capture &subroutine, $stdout, $stderr, $out_file, $err_file; Files provided will be clobbered, overwriting any previous data, but will persist after the call to "capture()" for inspection or other manipulation. By default, when no references are provided to hold STDOUT or STDERR, output is captured and silently discarded. # Capture STDOUT, discard STDERR capture &subroutine, $stdout; # Discard STDOUT, capture STDERR capture &subroutine, undef, $stderr; However, even when using "undef", output can be captured to specific files. # Capture STDOUT to a specific file, discard STDERR capture &subroutine, $stdout, undef, $outfile; # Discard STDOUT, capture STDERR to a specific file capture &subroutine, undef, $stderr, undef, $err_file; # Discard both, capture merged output to a specific file capture &subroutine, undef, undef, $mergedfile; It is a fatal error to merge STDOUT and STDERR and request separate, specific files for capture. # ERROR: capture &subroutine, $stdout, $stdout, $out_file, $err_file; capture &subroutine, undef, undef, $out_file, $err_file; If either STDOUT or STDERR should be passed through to the terminal instead of captured, provide a reference to undef -- "undef" -- instead of a capture variable. # Capture STDOUT, display STDERR capture &subroutine, $stdout, undef; # Display STDOUT, capture STDERR capture &subroutine, undef, $stderr; capture_exec() ($stdout, $stderr, $success, $exit_code) = capture_exec(@args); Captures and returns the output from "system(@args)". In scalar context, "capture_exec()" will return what was printed to "STDOUT". In list context, it returns what was printed to "STDOUT" and "STDERR" as well as a success flag and the exit value. $stdout = capture_exec('perl', '-e', 'print "hello world"'); ($stdout, $stderr, $success, $exit_code) = capture_exec('perl', '-e', 'warn "Test"'); "capture_exec" passes its arguments to "system()" and on MSWin32 will protect arguments with shell quotes if necessary. This makes it a handy and slightly more portable alternative to backticks, piped "open()" and "IPC::Open3". The $success flag returned will be true if the command ran successfully and false if it did not (if the command could not be run or if it ran and returned a non-zero exit value). On failure, the raw exit value of the "system()" call is available both in the $exit_code returned and in the $? variable. ($stdout, $stderr, $success, $exit_code) = capture_exec('perl', '-e', 'warn "Test" and exit 1'); if ( ! $success ) { print "The exit code was " . ($exit_code >> 8) . " "; } See perlvar for more information on interpreting a child process exit code. capture_exec_combined() ($combined, $success, $exit_code) = capture_exec_combined( 'perl', '-e', 'print "hello "', 'warn "Test " ); This is just like "capture_exec()", except that it merges "STDERR" with "STDOUT" before capturing output. Note: there is no guarantee that text printed to "STDOUT" and "STDERR" in the subprocess will be appear in order. The actual order will depend on how IO buffering is handled in the subprocess. qxx() This is an alias for "capture_exec()". qxy() This is an alias for "capture_exec_combined()". SEE ALSO
o IPC::Open3 o IO::Capture o IO::Utils o IPC::System::Simple AUTHORS
o Simon Flack <simonflk _AT_ cpan.org> (original author) o David Golden <dagolden _AT_ cpan.org> (co-maintainer since version 1.04) COPYRIGHT AND LICENSE
Portions copyright 2004, 2005 Simon Flack. Portions copyright 2007, 2008 David Golden. All rights reserved. You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file. perl v5.10.1 2010-02-15 IO::CaptureOutput(3pm)
All times are GMT -4. The time now is 05:09 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy