Is there a way to obtain the output of a linux command(like ifconfig) on a .txt file using a C program? [duplicate]
Asked Answered
U

2

-5

I actually wish to obtain all the network parameters like IP address, DNS server etc. on a .txt file using a C program on Linux.

Usanis answered 18/8, 2013 at 8:11 Comment(0)
K
4

You want popen(). Here's an example, taken from... (see below).

void get_popen_data() {
    FILE *pf;
    char command[COMMAND_LEN];
    char data[DATA_SIZE];
 
    // Execute a process listing
    sprintf(command, "ps aux wwwf"); 
 
    // Setup our pipe for reading and execute our command.
    pf = popen(command,"r"); 
 
    if(!pf){
      fprintf(stderr, "Could not open pipe for output.\n");
      return;
    }
 
    // Grab data from process execution
    fgets(data, DATA_SIZE , pf);
 
    // Print grabbed data to the screen.
    fprintf(stdout, "-%s-\n",data); 
 
    if (pclose(pf) != 0)
        fprintf(stderr," Error: Failed to close command stream \n");
 
    return;
}

Edit: I have removed the link to the original source code as it looks like a domain change has occurred and the site now contains some nasty looking malware.

Kinser answered 18/8, 2013 at 8:14 Comment(2)
Yeah but too tasty not to answer.Kinser
Another example of this: How can I run an external program from C and parse its output?Livraison
P
0

Yes, popen is good,while I have another way. You just open the file and use dup2 convert the fileds to STDOUT_FINO , then call system ,do anything you want. the output is just print to the filea.txt

Code:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc,char *argv[])
{
    int fd;
    if(argc != 2)
    {printf("./a.out <cmdString>\n"); return -1;}

    if((fd = open("a.txt",O_RDWR|O_CREAT|O_TRUNC)) < 0)
    {printf("open a.txt error\n");return -1;}

    if(dup2(fd,STDOUT_FILENO) != STDOUT_FILENO)
    {printf("dup2 error\n");return -1;}

    system(argv[1]);


    close(fd);  
    return 0;
}

Compile and call ./a.out ifconfig .

File a.txt:

eth0      Link encap:Ethernet  HWaddr 00:26:22:0A:CD:51  
          inet addr:192.168.1.4  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::226:22ff:fe0a:cd51/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1655 errors:0 dropped:0 overruns:0 frame:2
          TX packets:1344 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:829059 (809.6 Kb)  TX bytes:180519 (176.2 Kb)
          Interrupt:17 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:617 errors:0 dropped:0 overruns:0 frame:0
          TX packets:617 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:49256 (48.1 Kb)  TX bytes:49256 (48.1 Kb)
Pegmatite answered 18/8, 2013 at 8:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.