[C] shell comando uitvoeren en output opvangen.

Pagina: 1
Acties:

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
ik wil het commando uptime uitvoeren (ik draai freebsd, deze heeft niet zoveel info in /proc staan!)

ik wil alleen niet als in:
int system(const char *s);

een integer terug hebben maar een char *

kan dat ?
hoe ?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • whoami
  • Registratie: December 2000
  • Laatst online: 07-09 19:30
Wat wil je opvangen? De uitvoer van het programma dat je opstart?

Probeer dit eens in uw shell
code:
1
ls -l > testbestand.txt

en denk eens na hoe je dat zou kunnen implementeren in uw C programma.

https://fgheysels.github.io/


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
nee ik wil mijn hd niet gebruiken !

het is voor op een server, ik wil uptime, de tijd die nog resteerd voor dat de isdn verbinding word verbroken ed. via tcp/ip versturen.

Het liefst maak ik gebruik van system calls (kosten het minst)

maar het moet toch mogelijk zijn de uitvoer rechtstreeks op te vangen ?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
ik zie dat in /usr/include/protocols/rwhod.h

een struct staat.
code:
1
2
3
4
5
6
7
8
struct whod {
     char wd_vers;
     char wd_type;
     ....enz.
     int wd_loadav[3]; /*load avarage as in uptime*/
     int wd_boottime; /* time system booted */
     ...bbla bla
};

maar hoe kan ik deze struct nou gevuld krijgen en vervolgens uitlezen ?? ik zie in deze .h geen functie die deze struct retourneerd

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


Verwijderd

Gebruik pipes.

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
Op zaterdag 25 mei 2002 19:36 schreef Jan_Klaassen het volgende:
Gebruik pipes.
het gaat om een server.c die constant draait.

hoe kan ik dan ooit pipes gebruiken ?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

pipes zijn "gewoon" files waarin je van de ene kant data instopt en van de andere kant uitleest..

Je leest dus constant (via een select() dus) de pipe uit, terwijl je af en toe (via een sigalarm oid) via system ("uptime > mypipe") data de pipe instopt.

Yo dawg, I heard you like posts so I posted below your post so you can post again.


Verwijderd

popen () is wat je hebben moet
je krijgt een FILE pointer terug die je met bijvoorbeeld fscanf kan uitlezen :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op zaterdag 25 mei 2002 20:00 schreef xychix het volgende:

[..]

het gaat om een server.c die constant draait.

hoe kan ik dan ooit pipes gebruiken ?
je creeert eerst een pipe, daarna een childproces met fork (). In dat child proces zet je de stdout naar de schrijfkant van de pipe (met dup2 ()), en vervolgens start je het programma met een van de exec () functies

en in je parent proces kun je de pipe uit gaan lezen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

ik wil het commando uptime uitvoeren (ik draai freebsd, deze heeft niet zoveel info in /proc staan!)

ik wil alleen niet als in:
int system(const char *s);

een integer terug hebben maar een char *
man popen

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
Op zondag 26 mei 2002 01:35 schreef igmar het volgende:

[..]

man popen
ehhm.. ik heb het gelezen.. had ik jullie al verteld dat ik een beginnende C programmeur was ? maar goed ik ga er gewoon mee aan de slag..

ff googelen op popen()+uptime levert vast een klein stukkie voorbeeld code op.. ;)

thanks.

--edit--

zo lijkt het idd. niet zo moeilijk meer ! thanks voor de popen() tip!
code:
1
2
3
4
5
6
7
8
9
10
11
  FILE *p=popen("uptime","r");

  if (!p) {
    perror("popen");
    if (verbose) printf("Collecting load stats failed.\n");
    if (verbose) printf("Terminating child...\n");
    kill (pid,SIGTERM);
    exit(2);
  }
  fgets(buf,sizeof(buf),p);
  pclose(p);

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


Verwijderd

kan je in c niet zoiets als:

$uptime=`uptime` (zoals bij perl) ? (ik ken bijna geen C, maar misschien helpt het?)

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
nog 1 post voor de newbie's die na mij ook nog met dit probleem zitten:
probeer deze code eens.
het enige waar ik nog mee zit. als ik niet alles in een (lokale) buf gooi maar in fuctie argument buffer dan krijg ik maar 3 !!! tekens terug !
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <string.h>

int verbose=1;

char* execute(const char * commando,char * buffer)
{
  char buf[3200];
  float load;
  FILE *p=popen(commando,"r");

  if (!p) 
  {
    perror("popen");
    if (verbose) fprintf(stdout,"Something went wrong while reading the commands output.\n");
    exit(2);
  }
  fgets(buf,sizeof(buf),p);
  pclose(p);
  
  if (verbose) printf("Incoming string: %s\n",buf);
  strcpy(buffer,buf);
  return(buffer);
}

main()
{
  char buffer[32000];
  printf("%s",execute("cat /etc/passwd | grep root",buffer));
}

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad

Pagina: 1