Search This Blog

Saturday, March 10, 2012

in C, Assigning output of system() to a variable

in C, Assigning output of system() to a variable


[Log in to get rid of this advertisement]
I'm new to C and Linux and I am confused on how things work. I tried to search but I don't really know if I'm searching for the right thing because lots of other things come up.

Currently, I figured out that I can use shell commands inside C by using the method system(). They display out on the screen fine, but my problem is that I need to assign them to a variable, and not have them display on the screen (yet).

I'm planning to put the output of "ls -l" to a variable. I'm thinking of an array of strings (I think there are no strings, but an array char, so I guess this is an array of array of chars?) which will contain every line of the "ls -l" command except for the first line. (I think I need it in an array because I'm supposed to scroll through it in a menu-like style where I'm following example 18 on this link:
http://www.tldp.org/HOWTO/NCURSES-Pr...tml#MENUBASICS
but I think it's another question for another time, hopefully I can figure it out and not have to though, hahah)

What I have is this, but it doesn't work.

Code:
#include 
int main() {
   char output[] = system( "ls -l" );
   printf( "%s", output);
   return 0;
}
which gives this error.
Code:
system.c: In function 'main':
system.c:5: error: invalid initializer
I believe it is wrong, but I'm completely clueless. Perhaps you can help, thanks.

Last edited by Miaire; 01-28-2005 at 08:29 AM.
 
Old 01-28-2005, 08:27 AM   #2
Hivemind
Member

Registered: Sep 2004
Posts: 273

Rep: Reputation: 30
Two things. If a function returns a pointer-to-char (dynamically allocated or static) and you want to assign the return value to a variable you do:
Code:
char *ptr = some_func_returning_pointer_to_char();
Second, system() doesn't return char* it returns int. Do a:
Code:
$ man 3 system
for more details on the return value.

The system() call is part of standard C (and C++ of course) but how it operates and what you can do with the processes it spawns is platform-dependent.
 
Old 01-28-2005, 09:29 AM   #3
deiussum
Member

Registered: Aug 2003
Location: Santa Clara, CA
Distribution: Slackware
Posts: 895

Rep: Reputation: 31
man popen

I think this does what you are looking for.
 
Old 01-28-2005, 02:39 PM   #4
jim mcnamara
Member

Registered: May 2002
Posts: 964

Rep: Reputation: 32
popen example:
Code:
#include                
#include 
#include 
#include 

void process(const char *filespec)
{
	char cmd[296]={0x0}; /* 40 + 256 */  
	char tmp[256]={0x0};
	long total=0;
	int retval=0;
	FILE *in=NULL;
	
    snprintf(cmd,sizeof(cmd)-40,"ll %s | /usr/bin/cut -c 35-45 2>/dev/null",filespec);
    in=popen(cmd, "r");
    if(in==NULL)
    {
         perror("Shell execution error");
         exit(EXIT_FAILURE);
    }           
    while(fgets(tmp,4095,in)!=NULL) 
    {
         total+=atol(tmp);
    }        
    if(!feof(in))
    {
        perror("Input stream error");
        exit(EXIT_FAILURE);
    }    
    retval=pclose(in);
    if(retval==EOF || retval==127)    
    {
        perror("Shell invocation error");
        exit(EXIT_FAILURE); 
    }    
    fprintf(stdout,"%-64s total: %d\n",filespec,total);
}

int main(int argc, char *argv[])
{
    if(argc<2)
    {
    	char filespec[256]={0x0};
    	while(fgets(filespec,sizeof(filespec),stdin)!=NULL)
    	{
    	    char *p=memchr(filespec,'\n', sizeof(filespec));
    		if(p!=NULL) *p=0x0;
    	    process(filespec);
    	}      	  
    }	
    else
    {      	
        int i=1;
        while(i
 
Old 01-30-2005, 01:40 PM   #5
Miaire
LQ Newbie

Registered: Jan 2005
Location: Atlanta, GA
Distribution: Fedora Core 3
Posts: 11

Original Poster
Rep: Reputation: 0
Thanks for the answers, I have gotten what I needed. Figured out char arrays (strings) and casting char to int in the process.

This is what I came up with:
Code:
#include 
#include 

int main()
{
   int size=0;
   FILE *in=NULL;
   char temp[256];
   
   in=popen("ls -a -l | wc -l", "r");
   fgets(temp, 255, in);
   size = atoi(temp) - 1;

   char list[size][256];

   in=popen("ls -a -l", "r"); //for reading
   fgets(list[0], 255, in); // discard total: xxx, first line
  
   int i;
   for( i = 0; i < size; i++) {
      fgets(list[i], 255, in);   
   }

   for(i=0; i < size; i++) {
      printf("%s", list[i]);
   }
   return 0;
}
It does what I expect it to do (though it probably have hidden problems somewhere like memory things I don't really understand yet. Any comments on it?) , now to format and continue on with ncurses. Thanks for help!

No comments:

Post a Comment

Thank you