Ошибка сегментации (ядро сброшено) Перенаправление ввода - PullRequest
0 голосов
/ 09 июня 2018

Для моей программы я сделал funcs

void clear_forward() {
    if (saved_stdout) {
        dup2(saved_stdout, 1);
        if (close(saved_stdout))
            saved_stdout = 0;
    }
    if (saved_stdin) {
        dup2(saved_stdin, 0);
        if (close(saved_stdin))
            saved_stdin = 0;
    }
    if (saved_stderr) {
        dup2(saved_stderr, 2);
        if (close(saved_stderr))
            saved_stderr = 0;
    }
}

и

void forward() {
    int fd_out, fd_in, fd_err;
    if (!saved_stdout) {
        saved_stdout = dup(1);
    }
    if (!saved_stdin) {
        saved_stdout = dup(0);
    }
    if (!saved_stderr) {
        saved_stderr = dup(2);
    }
    if (strcmp(out_file.c_str(), "") != 0) {
        if ((saved_stdout < 0)) {
            fprintf(stderr, "Can't dup(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if ((fd_out = open(out_file.c_str(), O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
            fprintf(stderr, "Can't open(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if (dup2(fd_out, 1) < 0) // redirect output to the file
        {
            fprintf(stderr, "Can't dup2(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        close(fd_out);  // Descriptor no longer needed
    }

    if (strcmp(inp_file.c_str(), "") != 0) {
        if ((saved_stdout < 0)) {
            fprintf(stderr, "Can't dup(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if ((fd_in = open(inp_file.c_str(), O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
            fprintf(stderr, "Can't open(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if (dup2(fd_in, 0) < 0) // redirect input from file
        {
            fprintf(stderr, "Can't dup2(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        close(fd_in);  // Descriptor no longer needed

    }
    if (strcmp(err_file.c_str(), "") != 0) {
        if (saved_stderr < 0) {
            fprintf(stderr, "Can't dup(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        if ((fd_err = open(err_file.c_str(), O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) {
            fprintf(stderr, "Can't open(2) - (%s)\n", strerror(errno));
            exit(1);
        }

        if (dup2(fd_err, 2) < 0) // redirect input from file
        {
            fprintf(stderr, "Can't dup2(2) - (%s)\n", strerror(errno));
            exit(1);
        }
        close(fd_err);  // Descriptor no longer needed
    }
}

Так что после запуска я хочу, чтобы перенаправление работало.Но работает только перенаправление в файл, но не получение ввода из файла.В чем может быть проблема?

1008

Как мне это сделать?Выполнение - это просто выполнение exec из проанализированных аргументов. Как мне добавить к этому входные данные из файла?читать вручную из STDIN, если есть входной файл ??

1 Ответ

0 голосов
/ 09 июня 2018

В вашей функции forward():

if (!saved_stdin) {
    saved_stdout = dup(0);
}

Вы, вероятно, не хотите проверить saved_stdin и затем дублировать stdin до saved_stdout.

Что вы, вероятно, имели в виду:

if (!saved_stdin) {
    saved_stdin = dup(0);
}
...