perror генерирует неожиданное значение errno - PullRequest
1 голос
/ 12 февраля 2011

У меня неожиданное значение errno при использовании perror с glibc.Когда несуществующий файл указан как arg[1], он печатает Error: 2 (то есть ENOENT), как и ожидалось.Однако, когда строка perror ниже не закомментирована, она выдает ошибку 22 (EINVAL), независимо от того, что я передаю.Может кто-нибудь объяснить, почему это устанавливается?

РЕДАКТИРОВАТЬ: Похоже, что это какая-то ошибка Eclipse.Похоже, что в среде IDE perror вызывает какую-то ошибку, программа прекрасно работает в командной строке и отлично работает, если в списке аргументов в Eclipse указан правильный файл.Неправильно работает при запуске внутри Eclipse.

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
FILE *input_file;
input_file = fopen(argv[argc - 1], "r");
if (!input_file) {
 // perror(argv[argc-1]);
    fprintf(stderr, "Error: %d\n", errno);
    return (EXIT_FAILURE);
}
else {
    fclose(input_file);
}
return (EXIT_SUCCESS);
}

Ответы [ 3 ]

5 голосов
/ 12 февраля 2011

Вы не можете полагаться на значение errno после вызова других библиотечных функций, другими словами, сам вызов perror () может изменять значение errno Вам необходимо сохранить его во временной переменной если вы хотите использовать его после вызова других библиотечных процедур.

if (!input_file) {
    int err = errno;
    perror(argv[argc-1]);
    fprintf(stderr, "Error: %d\n", err);
    return (EXIT_FAILURE);
}
1 голос
/ 12 февраля 2011

Ваша программа работает для меня, как и ожидалось, здесь:

$ ./app fkjhsf
Error: 2

и без комментария perror():

$ ./app asdkfljh
asdkfljh: No such file or directory
Error: 2

Возможно, вызов perror() меняет ваш errno по какой-то причине?Какие версии операционной системы / компилятора / библиотеки вы используете?

0 голосов
/ 12 февраля 2011

Вероятно, он запускает программу без каких-либо аргументов.

Если это так, "argv [argc - 1]" будет вычисляться как мусор.

Должен быть код, чтобы убедиться, что "argc-1 "находится в допустимом диапазоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...