C system() how to send the output to an array??


 
Thread Tools Search this Thread
Top Forums Programming C system() how to send the output to an array??
# 1  
Old 01-19-2010
C system() how to send the output to an array??

Hi, im in need if wisdom here guys...

How could I store the output of commands like ping integrally directly into a array??? I'll be using system() to run the commands but how can I send the output to an array??? cuz I need to store it so that I can later copy the array's content to a buffer that will then be sent via sockets.
# 2  
Old 01-19-2010
With system(), you can't. It only returns the exit status of the process it ran, but not any of it's output on stdout or stderr. Take a loop at popen/pclose if you want to capture the output.
# 3  
Old 01-19-2010
system(3) does a fork and exec, to put it simply. You might want to look at popen(3), which returns a FILE pointer that allows you to read output from or write input to the command that you're executing.

Edit: Aaaand I just noticed that pludi has suggested exactly the same thing.
# 4  
Old 01-20-2010
Yeah i got it to work with popen the following way

Code:
  FILE *in;
  extern FILE *popen();
  char buff[512];
  char newline[100];
  char nstat[512];
  
  strcpy(newline, "\r\n");  



  if (!(in = popen("netstat -n", "r"))) {
    exit(1);
  }
 
  
  while (fgets(buff, sizeof(buff), in)) {
    strcat(nstat, buff);
    }

  strcat(nstat, newline); 
 

  pclose(in);

Works fine on Gentoo but crashed to "segmentation fault" on Ubuntu and I foresee it do the same on MAC OS X due to memory protection... I dumped the core and ran it through gdb now I know its in the strcat() function so my understanding of it is that is that after buff is wrote once to nstat then nstat is then made into read only so when newline tries to be appended to nstat it can't then fails to segmentation fault right? How can I get around this? anyone??
# 5  
Old 01-20-2010
From the man page of strcat (emphasis added)
Quote:
The strcat() function appends the src string to the dest string, overwriting the null byte ('\0') at the end of dest, and then adds a terminating null byte. The strings may not overlap, and the dest string must have enough space for the result.[...]
If src contains n or more characters, strcat() writes n+1 characters to dest (n from src plus the terminating null byte). Therefore, the size of dest must be at least strlen(dest)+n+1.
So as soon as you read more that 512 bytes from the process (which, with netstat will happen almost guaranteed) you'll start trying to write into unreserved space. This space might already be claimed by another process, and so the system intervenes.

One approach might be to allocate a large enough part of memory at the beginning.
A better approach would be to allocate a bit of memory using malloc(), and expanding that if needed using realloc().
# 6  
Old 01-20-2010
Thanks Pludi, attention error... I noticed the memory allocated for the command i was trying to run was way not enough... Another part of the problem I was getting was with the buffer size I had allocated for my socket's buffer.

Thanks again Pludi I appreciate Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

I want query output to send on mail using table tag and output should be in table

#! /bin/ksh #] && . ./.profile 2>/dev/null if test -f '.profile'; then . ./.profile; fi; #. .profile LOG_DIR=/app/rpx/jobs/scripts/just/logs sendEmail() { pzCType="$1"; pzTitle="$2"; pzMsg="$3"; pzFrom="$4"; pzTo="$5"; pzFiles="$6"; pzReplyTo="$7" ( ... (21 Replies)
Discussion started by: ankit.mca.aaidu
21 Replies

2. UNIX for Dummies Questions & Answers

Send files automatically to a remote system

Greetings, basically what I want to do is take the standard error from a cron file and store it on a file in a remote host (from Solaris to Linux). I want to create a cron file to do this everyday or put it on a script that will send it everyday to the other system (that doesnt matter). Any ideas... (2 Replies)
Discussion started by: picolin
2 Replies

3. UNIX for Dummies Questions & Answers

[Solved] Reading Array And Send An Email

I am trying to find an example for reading an array instead of reading a file and send out an email in ksh. Can you please help is that possible? Algorithm #!/bin/ksh i=0 set -A ARR if then let i=$ ARR="A does n't match with B" fi if then let i=$ ARR="P does n't match with Q"... (11 Replies)
Discussion started by: Ariean
11 Replies

4. Filesystems, Disks and Memory

iostat output vs TPC output (array layer)

Hi Guys, I've been having some arguments with my colleagues about one thing. Always my thought was that as as far as disk performance is concern by looking at the output of the iostat command (AIX) you would be able to identify if you have a hot disk and then by moving some files out that disk... (3 Replies)
Discussion started by: arizah
3 Replies

5. Shell Programming and Scripting

System Output in to an Array or variable

hey guys in only new to scripting as such, but i have a problem. i want to take the output of a search i do in the command line to then be in a variable but only a certain part of the output. this this what im doing: -bash-2.05b$ ldapsearch -x '(dn:=dc)' dc|grep dc= # base... (1 Reply)
Discussion started by: jmorey
1 Replies

6. Shell Programming and Scripting

awk - Pre-populating an array from system command output

So, here's a scenario that requires the same logic as what I'm working on: Suppose that you have a directory containing files named after users. For awk's purposes, the filename is a single field-- something parse-friendly, like john_smith. Now, let's say that I'd like to populate an array in... (2 Replies)
Discussion started by: treesloth
2 Replies

7. Solaris

how to send the output

Hi, how to send the output of a command directly to a file. For eg: am issuing metastat -a. How to send the output of this command to a file as well as mail. (3 Replies)
Discussion started by: rogerben
3 Replies

8. UNIX for Dummies Questions & Answers

send message to a remote system

I am analyzing snoop output and want to send "Hello world" to a remote system. I want to see if the message received is encrypted or not. can I use ping to send a text message? like ping "helloworld" <IP Addr> Please help. Thank you (5 Replies)
Discussion started by: rakeshou
5 Replies

9. UNIX for Advanced & Expert Users

To send a message to another system

How to send a message to another unix terminal along with the date specified (4 Replies)
Discussion started by: aajan
4 Replies

10. Programming

can we send arguments to system() call

Hi friends my C code is int main() { system("cp <source> <destination>"); } my question is how to set variables for <source> and <destination> how can we pass it to system() call. can you suggest me thankyou kingskar (6 Replies)
Discussion started by: kingskar
6 Replies
Login or Register to Ask a Question