LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   in C, Assigning output of system() to a variable (http://www.linuxquestions.org/questions/programming-9/in-c-assigning-output-of-system-to-a-variable-283252/)

Miaire 01-28-2005 07:21 AM

in C, Assigning output of system() to a variable
 
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 <stdlib.h>
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.

Hivemind 01-28-2005 07:27 AM

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.

deiussum 01-28-2005 08:29 AM

man popen

I think this does what you are looking for.

jim mcnamara 01-28-2005 01:39 PM

popen example:
Code:

#include <stdio.h>             
#include <stdlib.h>
#include <string.h>
#include <errno.h>

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<argc)
        {
            process(argv[i]);
            i++;       
        }
    }
    return 0;
}


Miaire 01-30-2005 12:40 PM

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 <ncurses.h>
#include <stdio.h>

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!


All times are GMT -5. The time now is 10:17 AM.