* command output to variables
@ 2009-01-07 12:35 Jai Sharma
2009-01-07 12:54 ` Xin Zou
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Jai Sharma @ 2009-01-07 12:35 UTC (permalink / raw)
To: linux-c-programming
Hi All
I m PHP, Perl programmer , but finally I need C to program in LInux.
In perl I simply use `` operator to get command output.
$who_output = `who` ;
but in C , how can i get the output. Using system function i m easily
run the command. But how to get its output .
system("who");
Plz help
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: command output to variables 2009-01-07 12:35 command output to variables Jai Sharma @ 2009-01-07 12:54 ` Xin Zou 2009-01-07 13:33 ` Michele Mondelli 2009-01-07 14:31 ` Bert Wesarg 2 siblings, 0 replies; 6+ messages in thread From: Xin Zou @ 2009-01-07 12:54 UTC (permalink / raw) To: Jai Sharma; +Cc: linux-c-programming It's not easy to get output in C. You can use pipe to get the result from standard output. On Wed, Jan 7, 2009 at 8:35 PM, Jai Sharma <jai.unix@gmail.com> wrote: > Hi All > > I m PHP, Perl programmer , but finally I need C to program in LInux. > In perl I simply use `` operator to get command output. > > $who_output = `who` ; > > > but in C , how can i get the output. Using system function i m easily > run the command. But how to get its output . > > system("who"); > > Plz help > -- > To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: command output to variables 2009-01-07 12:35 command output to variables Jai Sharma 2009-01-07 12:54 ` Xin Zou @ 2009-01-07 13:33 ` Michele Mondelli 2009-01-07 14:59 ` Jai Sharma 2009-01-10 14:57 ` Jason 2009-01-07 14:31 ` Bert Wesarg 2 siblings, 2 replies; 6+ messages in thread From: Michele Mondelli @ 2009-01-07 13:33 UTC (permalink / raw) To: linux-c-programming [-- Attachment #1: Type: text/plain, Size: 188 bytes --] A simple example of using pipe in Linux. Regards -- Homepage: http://www.mithenks.com Slackware GNU/Linux User since 2003 Registered Linux User #383379 Registered Linux Machine #391361 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: pipe.c --] [-- Type: text/x-csrc; name=pipe.c, Size: 439 bytes --] /* * Run the 'ls' command and print the output to stdout. * * Compile with * gcc -Wall pipe.c -o pipe * * * Mithenks <mithenks@siena.linux.it> * */ #include <stdio.h> #include <stdlib.h> int main() { FILE *pipe; char buffer[1024]; if ( (pipe = popen("ls","r") ) < 0 ) { perror("popen(): "); exit(-1); } fread(buffer,sizeof(buffer),1,pipe); printf("Output:\n%s\n",buffer); pclose(pipe); return 0; } ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: command output to variables 2009-01-07 13:33 ` Michele Mondelli @ 2009-01-07 14:59 ` Jai Sharma 2009-01-10 14:57 ` Jason 1 sibling, 0 replies; 6+ messages in thread From: Jai Sharma @ 2009-01-07 14:59 UTC (permalink / raw) To: Michele Mondelli; +Cc: linux-c-programming Hi ALL What I think is, C is hard to learn, but u guys r great. I hope i will enjoy learning C with u people, Thanks and Regards Jai On Wed, Jan 7, 2009 at 7:03 PM, Michele Mondelli <mithenks.ml@gmail.com> wrote: > A simple example of using pipe in Linux. > > Regards > > > -- > Homepage: http://www.mithenks.com > Slackware GNU/Linux User since 2003 > Registered Linux User #383379 > Registered Linux Machine #391361 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: command output to variables 2009-01-07 13:33 ` Michele Mondelli 2009-01-07 14:59 ` Jai Sharma @ 2009-01-10 14:57 ` Jason 1 sibling, 0 replies; 6+ messages in thread From: Jason @ 2009-01-10 14:57 UTC (permalink / raw) To: Michele Mondelli, jai.unix; +Cc: linux-c-programming [-- Attachment #1: Type: text/plain, Size: 1573 bytes --] Michele Mondelli wrote: > A simple example of using pipe in Linux. > > /* > * Run the 'ls' command and print the output to stdout. > * > * Compile with > * gcc -Wall pipe.c -o pipe > * > * > * Mithenks <mithenks@siena.linux.it> > * > */ > #include <stdio.h> > #include <stdlib.h> > > int main() { > > FILE *pipe; > char buffer[1024]; > > if ( (pipe = popen("ls","r") ) < 0 ) { This should be: if ( (pipe = popen("ls","r") ) == NULL ) { > perror("popen(): "); > exit(-1); > } > > Don't forget to clear the buffer, printf requires NULL terminated strings. memset(buffer, 0, sizeof(buffer)); > fread(buffer,sizeof(buffer),1,pipe); In a real implementation, you'll be looping on fread(), and you'll want to check the return value, like so: int rlen=0; if ( (rlen = fread(buffer,sizeof(buffer),1,pipe) ) != 1 ) { /*we have a short read or error*/ if( feof(pipe) != 0 ) { printf("Finished\n"); exit(0); } else if ( ferror(pipe) != 0 ) { printf("Error reading from pipe.\n"); exit(-1); } } > printf("Output:\n%s\n",buffer); > > pclose(pipe); > > return 0; > } So, that got a little messy, I've attached a re-write. It's not the most efficient thing in the world, but it should get you started. When in doubt, 'man function_name'. For example, 'man popen' told me I should be checking for a NULL return value, and 'man fread' told me I should be checking the number of items returned, _not_ the number of bytes. 'man brain' returned NULL for me, so any errors are solely my responsibility. ;-) hth, Jason. [-- Attachment #2: pipe.c --] [-- Type: text/plain, Size: 1055 bytes --] /* * Run the 'ls' command and print the output to stdout. * * Compile with * gcc -Wall pipe.c -o pipe * * * Mithenks <mithenks@siena.linux.it> * Changes added by Jason <lcprog@lakedaemon.net> * */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *pipe=NULL; char buffer[1024]; int rlen=0; int blen=0; if ( (pipe = popen("ls","r") ) == NULL ) { perror("popen(): "); exit(-1); } /*we subtract 1 so there is always a NULL terminator*/ blen = sizeof(buffer) - 1; while (1) { memset(buffer,0,sizeof(buffer)); if ( (rlen = fread(buffer,blen,1,pipe) ) != 1 ) { /*we have a short read or an error*/ if ( feof(pipe) != 0 ) { fprintf(stderr,"Finished"); printf("%s",buffer); break; } else if ( ferror(pipe) != 0 ) { fprintf(stderr,"Error reading from pipe.\n"); break; } else { /*short read*/ printf("%s",buffer); } } else { /*we got a full buffer*/ printf("%s",buffer); } } if(pipe != NULL) { pclose(pipe); } exit(0); } ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: command output to variables 2009-01-07 12:35 command output to variables Jai Sharma 2009-01-07 12:54 ` Xin Zou 2009-01-07 13:33 ` Michele Mondelli @ 2009-01-07 14:31 ` Bert Wesarg 2 siblings, 0 replies; 6+ messages in thread From: Bert Wesarg @ 2009-01-07 14:31 UTC (permalink / raw) To: Jai Sharma; +Cc: linux-c-programming On Wed, Jan 7, 2009 at 13:35, Jai Sharma <jai.unix@gmail.com> wrote: > Hi All > > I m PHP, Perl programmer , but finally I need C to program in LInux. > In perl I simply use `` operator to get command output. > > $who_output = `who` ; > > > but in C , how can i get the output. Using system function i m easily > run the command. But how to get its output . > > system("who"); use popen("who", "r") and read from the stream into a buffer Bert > > Plz help > -- > To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-01-10 14:57 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-01-07 12:35 command output to variables Jai Sharma 2009-01-07 12:54 ` Xin Zou 2009-01-07 13:33 ` Michele Mondelli 2009-01-07 14:59 ` Jai Sharma 2009-01-10 14:57 ` Jason 2009-01-07 14:31 ` Bert Wesarg
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).