En C, comment puis-je rediriger STDOUT_FILENO vers /dev/null à l'aide de dup2 et puis rediriger revenir à sa valeur initiale plus tard?

J'ai une mission, je travaille et je vais avoir de la difficulté à terminer. L'idée est d'écrire un programme si.c qui exécute un programme et si cela réussit, il exécute la deuxième programme. Je suis censé supprimer la sortie standard de la première émission et unsupress de sortie standard pour la deuxième. Je reçois le message d'erreur sur plusieurs tests. Par exemple: "./si l'écho n'then echo oui" renvoie "echo:write error: Bad file descriptor". J'ai essayé de trouver ce que je fais mal en ligne, mais pas de chance.

Voici mon code:

#include <fcntl.h>
#include <sys/wait.h>
#include <stdio.h>
#include "tlpi_hdr.h"
int main(int argc, char *argv[])
{
if(argc < 4){
fprintf(stderr,"Incorrect number of arguments.\n");
exit(EXIT_FAILURE);
}
int thenArg = 0;
char then[4];
strcpy(then,"then");
for(int x=1; x<argc; x++){
if(strncmp(argv[x], then, 4) == 0) thenArg = x;
}
if(thenArg == 0){
fprintf(stderr,"No 'then' argument found.\n");
exit(EXIT_FAILURE);
}
int save_out = dup(STDOUT_FILENO);
if(save_out == -1){
fprintf(stderr,"Error in dup(STDOUT_FILENO)\n");
exit(EXIT_FAILURE);
}
int devNull = open("/dev/null",0);
if(devNull == -1){
fprintf(stderr,"Error in open('/dev/null',0)\n");
exit(EXIT_FAILURE);
}
int dup2Result = dup2(devNull, STDOUT_FILENO);
if(dup2Result == -1) {
fprintf(stderr,"Error in dup2(devNull, STDOUT_FILENO)\n");
exit(EXIT_FAILURE);
}
int program1argLocation = 1;
int program2argLocation = thenArg + 1;
int program1argCount = thenArg-1;
int program2argCount = argc-(program2argLocation);
char *program1args[program1argCount+1];
char *program2args[program2argCount+1];
for(int i=0; i<program1argCount; i++){
program1args[i]=argv[program1argLocation + i];
}
program1args[program1argCount] = NULL;
for(int i=0; i<program2argCount; i++){
program2args[i]=argv[program2argLocation + i];
}
program2args[program2argCount] = NULL;
pid_t pid = fork();
int child_status;
switch (pid) {
case -1:
fprintf(stderr,"Fork failed\n");
exit(EXIT_FAILURE);
case 0: //child
//child will run program 1
if(execvp(program1args[0],&program1args[0]) == -1){
fprintf(stderr,"Program 1 Failed.\n");
exit(EXIT_FAILURE);
}  
default: //parent
//parent will run program2
pid = wait(&child_status);
if(WEXITSTATUS(child_status) == 0){
dup2(save_out, STDOUT_FILENO);
int prog2status = execvp(program2args[0],&program2args[0]);
if(prog2status == -1) {
fprintf(stderr,"Program 2 failed.\n");
exit(EXIT_FAILURE);
}  
}  
}  
}  
char then[4]; strcpy(then, "then"); est un débordement de la mémoire tampon. Pourquoi ne pas simplement utiliser if(0 == strcmp(argv[x], "then")) ou if(0 == strncmp(argv[x], "then", 4)) à la place?
Je pense que j'ai essayé la première fois que j'ai mis en œuvre et a couru dans une sorte d'erreur. Je me souviendrai de cette et de renvoyer à la prochaine fois, je tombe sur la même chose. Merci!!!! Pas utilisé pour C encore de sorte que toute entrée comme c'est grand.

OriginalL'auteur Frank | 2013-02-13