Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Linux/Unix ::  Externes Programm mit Rückgabewert     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Peter3M
Unregistrierter




Beitrag Peter3M Unregistrierter 01:23:11 25.04.2012   Titel:   Externes Programm mit Rückgabewert            Zitieren

Hi,
Ich wollte mal fragen, wie ich ein Externes Programm (zB cat,ls, find, file, ...) aus C heraus ausführen kann und die Ausgabe dann bekomme?

Also das was die sonst auf die Konsole schreiben.

Mit fork den Prozess spalten und im child über exec das gewünschte Programm starten (also es wird das child ersetzt).
Nur wie komme ich dann an die Ausgabe?
Mit Pipes könnte ich zwischen zwei selbst geschrieben kommunizieren, aber so?
Öder kann ich eine Pipe auch an das per Exec gestartet mit geben um das Ergebnis zu erhalten?
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 17164
Beitrag C++ Forumbot Forumbot 01:32:35 25.04.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
lagalopex
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.01.2008
Beiträge: 319
Beitrag lagalopex Mitglied 11:44:28 25.04.2012   Titel:              Zitieren

http://lmgtfy.com/?q=fork+exec+stdin+pipe

Je nach dem, was genau du machen möchtest, gibt es evtl auch elegantere Alternativen.
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23069
Beitrag rüdiger Moderator 14:33:45 25.04.2012   Titel:              Zitieren

Der Trick ist, dass der neue Prozess die Handles des alten übernimmt. Du kannst also mit pipe(2) vorher eine pipe öffnen und dann STDOUT_FILENO mit der pipe verbinden (siehe dup(2)).
pferdefreund
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2009
Beiträge: 165
Beitrag pferdefreund Mitglied 19:33:17 27.04.2012   Titel:              Zitieren

Schau dir mal popen an - das kann sowas. Verwende ich eigntlich sehr oft.
Hab mir sogar ne Pfeiffe-Routine für Open Cobol gebastelt. Man brauchts halt immer wieder mal.
seldon
Unregistrierter




Beitrag seldon Unregistrierter 20:49:08 27.04.2012   Titel:              Zitieren

Man kann vor exec* stdout in die Pipe umleiten.

Zum Beispiel:
C++:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#define _GNU_SOURCE

#include <sys/types.h>

#include <sys/wait.h>
#include <unistd.h>

#include <stddef.h>

#include <stdio.h>
#include <stdlib.h>
 
int main() {
  pid_t pid;
  int status;
  int pipes[2];
 
  pipe(pipes);
  pid = fork();
 
  if(pid == -1) {
    perror("fork");
  } else if(pid == 0) {
    /* Kindprozess.
     *
     * Leseende der Pipe schließen, stdout in Schreibende umleiten.
     */

    close(pipes[0]);
    dup2 (pipes[1], STDOUT_FILENO);
 
    execlp("ls", "ls", "-l", "-a", NULL);
  } else {
    /* Vaterprozess.
     *
     * Der kann dann aus dem Leseende der Pipe das lesen, was der Kindprozess
     * nach stdout schreibt.
     */

    char *s = NULL;
    FILE *fd_pipe;
    size_t n = 0;
 
    close(pipes[1]);
 
    printf("child pid: %u\n", pid);
 
    fd_pipe = fdopen(pipes[0], "r");
    while(getline(&s, &n, fd_pipe) != -1) {
      printf("Vom Kindprozess: %s", s);
    }
 
    free(s);
 
    waitpid(pid, &status, 0);
 
    if(WIFEXITED(status)) {
      printf("Return value: %d\n", WEXITSTATUS(status));
    }
  }
 
  return 0;
}

Dabei ist _GNU_SOURCE nur für getline notwendig. Falls gewollt, kann man mit stderr und einer weiteren Pipe auf die gleiche Weise verfahren.
Peter3M
Unregistrierter




Beitrag Peter3M Unregistrierter 19:33:19 30.04.2012   Titel:              Zitieren

Hi danke mal!

Dann noch 3 Fragen:
1)
Wieso wurde das in Linux/Unix verschoben?
Sind alles Konstrukte, die doch auf Windows genau so laufen?
Oder gings um die Beispielbefehle?

2)
Wie lese ich am besten aus der pipe heraus?
Also jetzt am Beispiel "ls" zB.
da hätte ich dann gerne jedes Element in einem Array.
Sprich ich müsste ein Dynamisches Array anlegen und dieses würde auch aus dynamischen einträgen (strings) bestehen.

Wie Handhabt ihr sowas?
Welche "read" (als Überbegriff) Funktion wäre da geeigent?
Würde weil jedes Zeichen einzeln ... an einen String anhängen, warten bis space kommt/ bzw \n bzw \r und dann in array hinzufügen ...?

Was würdet ihr da vorschlagen?

3) sollte man nicht vor dem lesen wait haben? sonst ließt man die pipe aus bevor es zu ende ist? Und wozu ist free(s)?
c++.de :: Linux/Unix ::  Externes Programm mit Rückgabewert   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.