LINUX.ORG.RU

errno не установлена (cygwin)


0

0

Столкнулся с такой проблемой - после неправильного вызова socket, perror нормально выдает сообщение об ошибке, а strerror(errno) - говорит всё в порядке, оказалось что errno = 0.

status = sid = socket(AF_INET, 99, 0); // не правильный socket type perror("error"); // error: Socket type not supported cout << strerror(errno) << endl; // No error (errno = 0)

Может кто сталкивался - использую cygwin, хотя врядли это его особенности, скорее что-то упустил.


А тебя код не отформатирован, но если вначале вызывается perror, а потом strerror то perror естественно вызовет write, который переустоновит errno в 0 и strerror ни о какой ошибке не узнает. А вообще привиди кусок кода полностью и в отформатированном виде. И зачем вызывать подряд perror и strerror?

OxiD ★★★★
()
Ответ на: комментарий от idle

Вот сам код:

#include <iostream> #include <sys/socket.h> #include <errno.h> #include <stdio.h>

using namespace std;

int main(){

int sid = socket(AF_INET, 99, 0); if (sid < 0) perror("error"); cout << sid << " " << errno << endl;

}

Результат под cygwin: error: Socket type not supported -1 0

Результат под RedHat: error: Invalid argument -1 29

Порядок вызова для Linux значения не имеет - Invalid argument и errno не равен нулю, в cygwin меняя вторую и третью строчки получаем: -1 0 error: No error короче и не знаю чего думать.

Bauron
() автор топика
Ответ на: комментарий от Bauron

я ничего не знаю про cygwin, но похоже
perror() портит errno. проверьте, чтобы не
осталось сомнений.

можете переопределить perror для себя:

#define perror(s)         \
do {                      \
    int __err__ = errno;  \
    perror(s);            \
    errno = __err__;      \
} while (0)

или просто написать реализацию, чтобы не
тащить из библиотеки.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.