In C, wie kann ich die Umleitung STDOUT_FILENO nach /dev/null verwenden von dup2, und leiten Sie anschließend wieder auf den ursprünglichen Wert später?

Habe ich eine Zuordnung, die ich arbeite und ich Schwierigkeiten beim finishing es. Die Idee ist, ein Programm zu schreiben, wenn.c führt zu einem Programm, und wenn das gelingt, führt es das zweite Programm. Ich soll zum unterdrücken der standard-Ausgabe des ersten Programms und unsupress standard-Ausgabe für die zweite. Ich bekomme die Fehlermeldung auf mehrere tests. Zum Beispiel: "./wenn echo Nein, dann echo ja" gibt "echo:write error: Bad file descriptor". Ich habe versucht, herauszufinden, was ich falsch mache online, aber kein Glück.

Hier ist mein 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"); ist ein buffer overflow. Warum verwenden Sie nicht nur if(0 == strcmp(argv[x], "then")) oder if(0 == strncmp(argv[x], "then", 4)) statt?
  • Ich denke, ich habe es ausprobiert, das erste mal habe ich es umgesetzt und lief in irgendeine Art von Fehler. Ich werde nicht vergessen, dies und verweisen auf das nächste mal komme ich über die gleiche Sache. Danke!!! Nicht verwendet, um C noch so jede Eingabe wie dieses ist groß.
InformationsquelleAutor Frank | 2013-02-13
Schreibe einen Kommentar