2009-03-18 8 views

Antwort

7

Würde popen funktionieren? Es läutet den Prozess, dann lesen/schreiben Sie mit einem FILE* Griff

5

Dann ist Ihre Wahl system(), oder mit einer Bibliothek, die Prozess laichen für Sie umschließt. Letzteres oder die hardcore Methode, die Sie vermeiden wollten, wird empfohlen, wenn Sie eine genaue Kontrolle über Fehler, Pipes und so weiter haben wollen.

3

System() ist einfach genug.

Aber Sie sollten versuchen, dies nicht zu tun, wenn Sie können. Skripte funktionieren am besten, wenn sie oben liegen, nicht darunter. Wenn Sie mit UNIX arbeiten, ist es oft besser, die Arbeit zu unterbrechen und ein Skript auf oberster Ebene zu schreiben, um alle Teile aufzurufen.

Ich erinnere mich an einen Programmierer beobachten eine große Anzahl von Systemaufrufen in seinem C-Code hinzufügen, um zu vermeiden, die Bourne-Shell zu lernen. Er dachte, es wäre ein kluger und schneller Weg, um es in Gang zu bringen, aber als es scheiterte, scheiterte es sehr. Er hat viel Zeit verschwendet, um das Chaos zu beseitigen. Es wäre viel schneller gewesen, ein paar einfache Shell-Befehle zu lernen ...

Paul.

1

libc hat Funktionen system und popen, die sich wie ein bisschen arbeiten:

int system(cont char *command) { 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    int status; 
    pid_t child = fork(); 
    if (child == 0) { 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    waitpid(child, &status, 0); 
    return status; 
} 

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

(außer mit mehr Fehlerprüfung und Sachen)

Wenn Sie durch eine feinere Kontrolle über Argument Handling (statt gehen wollen sh), oder Sie möchten die Kontrolle über mehr als eines von {stdin, stdout, stderr} haben, müssen Sie es selbst schreiben oder eine Bibliothek finden. Die Standardbibliothek deckt jedoch die meisten Anwendungsfälle ab.

1

Sie können es über das System tun() nennen diese Thread ist ein gutes Beispiel

Verwandte Themen