LINUX.ORG.RU

Сообщения shotakoe

 

accept() ведёт себя по-разному в С и С++? Errno=17 File exists.

 

UPD: видимо, я сообщил мало информации, чтобы местные умники смогли вычислить проблему. Решил оставить сервер на C++ и не переделывать. Всем спасибо!

Здравствуйте. Переписываю программу с С++ на С. Всё скомпилировалось, но проблема выскочила там, где я не ожидал. Логика приложения не изменилась, accept() на блокирующем слушающем сокете, одинаковая инициализация; в С++ работает без вопросов, а в С возвращает -1 и устанавливает errno = 17 (File exists), то есть не то чтобы проскакивал с WOULDBLOCK, а именно ошибка выполнения функции. Дебаггер показывает, что iWaitingSocketDescriptor подаётся на вход верный.

Разница в коде вот такая:

void *MyClass::Accept_Thread ( void *vptr_args ) {
	int iNewConnection;
	do {
		iNewConnection = accept ( iWaitingSocketDescriptor, NULL, NULL );
}

static void *Accept_Thread ( void *vptr_args ) {
	int iNewConnection;
	do {
		iNewConnection = accept ( iWaitingSocketDescriptor, NULL, NULL );
}

В первом случае iWaitingSocketDescriptor - статический член класса, во втором - глобальная переменная, в обоих случаях дебаггер показывает, что значение корректное.

Как я уже писал, инициализация в обоих случаях одна и та же:

  stWaitingSocket.sin_family = AF_INET;
  stWaitingSocket.sin_port = htons ( 1025 );
  stWaitingSocket.sin_addr.s_addr = htonl ( INADDR_ANY );
  iWaitingSocketDescriptor = socket ( AF_INET, SOCK_STREAM, 0 );
  iResult = bind ( iWaitingSocketDescriptor, ( struct sockaddr * ) &stWaitingSocket, sizeof ( stWaitingSocket ) );
  iResult = listen ( iWaitingSocketDescriptor, 1 );
... и проходит без ошибок.

Где-то ошибка, но, видимо, глаз замылился или, что скорее, из-за неопытности не знаю или просто не понимаю, что делаю не так. Подскажите пожалуйста?

shotakoe
()

Что будет со статической функцией-потоком, если удалить экземпляр класса?

 

Здравствуйте.

Подскажите, пожалуйста, ответ на такой вопрос. Я написал класс С++, в котором в качестве метода присутствует статическая функция, которая идёт в качестве параметра в pthread_create. В конструкторе единственного экземпляра класса я создаю этот поток, работаю там с данными-членами класса и глобальными переменными, используя мьютексы для совместно используемых данных, всё работает неплохо, но вот какое дело.

1. Что будет с самим потоком и текущей «точкой исполнения», если во время выполнения этой статической функции-потока произойдёт удаление экземпляра класса из другого потока?

2. Если вся эта конструкция не предусматривает нормального останова и клинапа, но само приложение вообще предназначено для того, чтобы работать на серверной стороне пока работает само железо и падать будет только вместе с ним (выключение или перезапуск приложения не потребуются), то можно ли оставить так или «по хорошему» всегда требуются механизмы перезапуска?

Посоветуйте, пожалуйста, заранее благодарен за конструктив.

shotakoe
()