что если (ошибка! = EEXIST) в c?

что такое errno и EEXIST?

#include<errno.h>
    if(errno != EEXIST) {
        perror(sha1_dir);
        exit(1);
    }

Я не могу понять условие оператора if. это говорит, если errno не существует?


person woowoo    schedule 02.02.2021    source источник
comment
Это буквально говорит о том, что если errno не равно EEXIST.   -  person mkrieger1    schedule 03.02.2021
comment
так что такое еррно?   -  person woowoo    schedule 03.02.2021
comment
Сейчас это ничего не значит. errno, возможно, будет установлен вызовом какой-либо функции (это переменная, область действия которой должна быть локальной для потока). Проверьте настройку функции errno, чтобы узнать, что означает EEXIST в контексте этой функции.   -  person Christian Gibbons    schedule 03.02.2021
comment
Эта страница может оказаться полезной: en.cppreference.com/w/c/error/errno   -  person Brian    schedule 03.02.2021
comment
Что такое errno, зависит от кода над той строкой, которую вы не показали.   -  person mkrieger1    schedule 03.02.2021
comment
Чтобы получить общее представление о том, что означает EEXIST, вы можете проверить '/usr/include/asm/errno-base.h' и найти это: #define EEXIST 17 /* File exists */   -  person Christian Gibbons    schedule 03.02.2021
comment
В нем говорится, что если предыдущая функция доступа к файлу, которая не удалась, потерпела неудачу по причине, иной, чем отсутствие файла, выведите соответствующее сообщение об ошибке и завершите работу. Поэтому, если файл существует, но мы не можем его прочитать из-за чего-то вроде отказа в доступе, это ошибка. Но если причина, по которой мы не смогли прочитать файл, заключалась в том, что его там вообще не было, все в порядке, так что продолжайте. Это распространенный шаблон, когда чтение файла является необязательным, например файл конфигурации или файл состояния для хранения данных между запусками программы, но который не будет существовать при самом первом запуске программы.   -  person Steve Summit    schedule 03.02.2021
comment
Извините, мое объяснение было почти полностью неверным. Я имел в виду ENOENT. В этом случае это Если предыдущая функция доступа к файлу, которая не удалась, потерпела неудачу по причине, отличной от того, что файл или каталог существовали, выведите соответствующее сообщение об ошибке и выйдите. Вы можете сделать это после вызова mkdir() для создания каталога. Если он попытался и не смог создать каталог, это, вероятно, ошибка. Но если каталог уже существует, программе не нужно его создавать, так что продолжайте.   -  person Steve Summit    schedule 03.02.2021
comment
errno — это своего рода глобальная переменная, которая содержит код, указывающий, почему последний системный вызов не удался. <errno.h> содержит набор констант -- EPERM, ENOENT, EEXIST и т. д., кодирующих причины отказа. И затем perror() — это библиотечная функция, которая просматривает errno и печатает удобочитаемую строку, такую ​​​​как «Отказано в доступе», соответствующую коду в errno. См. также комментарии в этот недавний вопрос .   -  person Steve Summit    schedule 03.02.2021
comment
@SteveSummit Спасибо, ваш ответ ответил на мой вопрос.   -  person woowoo    schedule 03.02.2021


Ответы (1)


Если вы покопаетесь в errno.h, вы обнаружите, что EEXIST — это макрос C, определенный в другом файле. На моем компьютере с Debian он находится в /usr/include/asm-generic/errno-base.h.

#define EEXIST      17  /* File exists */

Запустите man errno, чтобы найти значение переменной errno:

DESCRIPTION
       The  <errno.h> header file defines the integer variable errno, which is
       set by system calls and some library functions in the event of an error
       to indicate what went wrong.

Таким образом, смысл блока кода состоит в том, чтобы проверить errno, сгенерированный последней функцией, и, если это не файл существует (файл не существует), вывести сообщение об ошибке.

Запустите man perror для получения дополнительной информации. Серьезно, вы должны изучить C из какой-нибудь книги, прежде чем задавать такой вопрос stackoverflow.

person D.Liu    schedule 03.02.2021