donc, j'essaie d'écrire une chose qui doit saisir la production de commandement, puis mal le traiter puis le transmettre à un autre programme.
mais j'ai un problème, je ne peux pas savoir comment obtenir la sortie de la commande et le stocker ci-dessous est un échantillon de ce que j'ai
if(fork() == 0){
execl("/bin/ls", "ls", "-1", (char *)0);
/* hopefully do something with the output here*/
}else{
*other stuff goes here*
}`
donc, fondamentalement, je me demande si vous pouvez obtenir la sortie de "EXECL" et transmettez-la à quelque chose d'autre (par exemple en la stockant dans une sorte de tampon).
toute suggestion sera appréciée. merci gars .. `
Vous devez créer un tuyau du processus parent à l'enfant, en utilisant pipe()
. Ensuite, vous devez rediriger standard ouput
(Stdout_fileno) et error output
(Stardr_fileno) en utilisant dup
ou dup2
Pour le tuyau et dans le processus parent, lisez du tuyau. Cela devrait fonctionner.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define die(e) do { fprintf(stderr, "%s\n", e); exit(EXIT_FAILURE); } while (0);
int main() {
int link[2];
pid_t pid;
char foo[4096];
if (pipe(link)==-1)
die("pipe");
if ((pid = fork()) == -1)
die("fork");
if(pid == 0) {
dup2 (link[1], STDOUT_FILENO);
close(link[0]);
close(link[1]);
execl("/bin/ls", "ls", "-1", (char *)0);
die("execl");
} else {
close(link[1]);
int nbytes = read(link[0], foo, sizeof(foo));
printf("Output: (%.*s)\n", nbytes, foo);
wait(NULL);
}
return 0;
}
Ouvrez un tuyau et changez de stdout pour correspondre à ce tuyau.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int pipes[2];
pipe(pipes); // Create the pipes
dup2(pipe[1],1); // Set the pipe up to standard output
Après cela, tout ce qui va à STDOUT (par exemple via Printf), sort du tuyau [0].
FILE *input = fdopen(pipe[0],"r");
Vous pouvez maintenant lire la sortie comme un descripteur de fichier normal. Pour plus de détails, regardez ceci
Merci Jonathan Leffler et j'épanouis le code ci-dessus pour qu'il ne puisse lire toute réponse pendant une fois.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#define die(e) do { fprintf(stderr, "%s\n", e); exit(EXIT_FAILURE); } while (0);
int main() {
int link[2];
pid_t pid;
char foo[4096 + 1];
memset(foo, 0, 4096);
if (pipe(link)==-1)
die("pipe");
if ((pid = fork()) == -1)
die("fork");
if(pid == 0) {
dup2 (link[1], STDOUT_FILENO);
close(link[0]);
close(link[1]);
execl("/bin/ls", "ls", "-1", (char *)0);
die("execl");
} else {
close(link[1]);
int nbytes = 0;
std::string totalStr;
while(0 != (nbytes = read(link[0], foo, sizeof(foo)))) {
totalStr = totalStr + foo;
printf("Output: (%.*s)\n", nbytes, foo);
memset(foo, 0, 4096);
}
wait(NULL);
}
return 0;
}