LINUX.ORG.RU

Как сделать неблокирующий accept на сокет?

 , non-blocking,


0

1

Хочу по-человечески завершать демон при поступлении сигнала, но accept всю малину портит: т.к. он блокирует основной поток, ничего с ним поделать не могу.

Есть ли вариант как-то проверять наличие подключений и лишь потом, если они есть, вызывать accept?

А то пока только такой костыль на ум приходит: запустить accept в отдельный поток, а в main() тупо пасти флаг глобального выхода, и если этот флаг установлен, то посылать этому потоку pthread_cancel. Но как-то это кажется костыльным...

Возможно ли сделать select на сокет перед тем, как accept вызывать?

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)

Ответ на: комментарий от ossa

Ага, я уже нашел. Спасибо. Вопрос снят.

Eddy_Em ☆☆☆☆☆
() автор топика

Решение

	while(!global_quit){
		fd_set readfds;
		struct timeval timeout;
		socklen_t size = sizeof(struct sockaddr_in);
		struct sockaddr_in their_addr;
		int newsock;
		FD_ZERO(&readfds);
		FD_SET(sock, &readfds);
		timeout.tv_sec = 0; // wait not more than 100 millisecond
		timeout.tv_usec = 100000;
		int sel = select(sock + 1 , &readfds , NULL , NULL , &timeout);
		if(sel < 0){
			if(errno != EINTR)
				WARN("select()");
			continue;
		}
		if(!(FD_ISSET(sock, &readfds))) continue;
		DBG("accept");
		newsock = accept(sock, (struct sockaddr*)&their_addr, &size);
		if(newsock <= 0){
			WARN("accept()");
			continue;
		}
		pthread_t handler_thread;
		if(pthread_create(&handler_thread, NULL, handle_socket, (void*) &newsock) < 0)
			WARN("pthread_create()");
		if(pthread_kill(readout_thread, 0) == ESRCH) // the readout thread is dead
			break;
	}
Eddy_Em ☆☆☆☆☆
() автор топика

Ну что за западло!

/usr/bin/ld: CMakeFiles/tvguide.dir/capture.c.o: неопределённая ссылка на символ <<jpeg_mem_dest@@LIBJPEG_8.0>>
/usr/bin/ld: замечание: <<jpeg_mem_dest@@LIBJPEG_8.0>> определён в DSO /usr/lib/libjpeg.so.8, попробуйте добавить его в командную строку компоновщика

Вот что еще нужно этой заразе, чтобы функция jpeg_mem_dest линковалась? Ведь она есть в библиотеке! Зачем свою писать??

Eddy_Em ☆☆☆☆☆
() автор топика

Хочу по-человечески завершать демон при поступлении сигнала, но accept всю малину портит: т.к. он блокирует основной поток, ничего с ним поделать не могу.

Портят малину твои кривые руки. Делай exit из обработчика сигнала и не компостируй никому мозг.

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

Делай exit из обработчика сигнала

Он хочет по-человечески.

anonymous
()

В общем, ни с jpeg, ни с png пока не получается. libpng16 ругается на преобразование указателя.

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

ну так а ты прописал target_link_libraries? А то найти то нашел, а что делать то с ними ты ему рассказал?

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

Ну я и лох! Забыл

list(APPEND ${PROJ}_INCLUDE_DIRS ${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${TIFF_INCLUDE_DIR})
list(APPEND ${PROJ}_LIBRARIES ${JPEG_LIBRARY} ${PNG_LIBRARY} ${TIFF_LIBRARY})

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от post-factum

epoll

select православней

pthread_sigmask

зачем?

pthread_kill

ага, использую, чтобы проверить, не помер ли поток

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

ЧО? Какой сет дескрипторов? Тупо установил FD_SET, сделал select, да проверил на дескриптор сокета. Код выше был. А с этим дебильным еполлом нужно 100500 левых строк написать. Нафиг оно нужно, такое "щассье"?

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

«Лучше день потерять, зато потом за 5 минут долететь» (с)

anonymous
()
Ответ на: комментарий от post-factum

Да пофиг. Лишь бы работало. Меньше всего меня кошерность кода беспокоит. Главное — попроще, поменьше писанины и как можно меньше читанины. Поэтому на сях и пишу, что самый простейший язык.

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

Ну так если говном не хочешь обмазываться, то косметикой делай это хотя бы не вызывающе =).

post-factum ★★★★★
()
Ответ на: комментарий от anonymous

Ну так иду по пути наименьшего сопротивления и наивысшей производительности. Нафиг мне эти ваши ущербности?

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

ой, все, Эдик. спокойной ночи

anonymous
()
Ответ на: комментарий от Eddy_Em

Ты хотя бы перед заталкиванием дескриптора в сет проверяй, что он <FD_SETSIZE. А то мало ли какой конфуз в продакшене приключится =).

Deleted
()
Ответ на: комментарий от Eddy_Em

Эди, это был тонкий намёк, а ты бугага.

anonymous
()
Ответ на: Ну что за западло! от Eddy_Em

Чувак, у тебя система как-то странно сломана, у тебя линковщик по-русски разговаривать начал. Ты бы локаль починил, а то жутко неудобно, поди.

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

Аа, сорри, посмотрел твой код. С локалью у тебя все ок, видимо линковщик очень хотел выругаться матом.

Ты бы хоть на питоне писал, глядишь толк бы вышел.

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

Я лучше застрелюсь из «тополя»!

А че так? Не, застрелиться - тоже отличный вариант, но почему ты думаешь, что решение твоих задач на питоне будет менее эффективно, чем на C? Я, например, уверен в обратном. Скорость разработки возрастет примерно вдвое, что наверняка заинтересует твоего работодателя. Плюс, ты перестанешь писать отвратительный код, чем сделаешь всему миру большое одолжение.

И правда, неужели тебе удобно когда компилятор и линковщик говорят по-русски?

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

почему ты думаешь, что решение твоих задач на питоне будет менее эффективно, чем на C?

Потому что а) пхытон — говно, б) я его не осилю, т.к. см. п. а).

Скорость разработки возрастет примерно вдвое, что наверняка заинтересует твоего работодателя

Ну что за чушь? Если я буду эффективней работать, зарплата у меня все равно будет 17000 рублей в месяц!

ты перестанешь писать отвратительный код

Да что ты говоришь! На пхытоне-то? Угу-угу...

неужели тебе удобно когда компилятор и линковщик говорят по-русски?

Чего??

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

Потому что а) пхытон — говно

Обоснуй. Про логопеда ты сам знаешь, да?

Если я буду эффективней работать, зарплата у меня все равно будет 17000 рублей в месяц!

Если ты не будешь эффективней работать, то у тебя всю жизнь будет зарплата 17000 рублей в месяц. Если будешь, то возможны варианты.

Да что ты говоришь

Наш брат-травокур Гвидо постарался так, что даже безрукому придется писать по-человечески. Да, питон тебя вынудит писать быстро и красиво. Ты же не кристальщик, чтобы в 512 байт умещаться, да? И не операционки пишешь? За каким хером тебе Си сдался? Самолюбие тешить? Поднимай уровень абстракций, сможешь половину рабочего времени чем-нибудь полезным заниматься вместо того, чтобы указатели разыменовывать.

Чего

Глаза разуй, у тебя ld выдает сообщения на русском языке. Ты правда так живешь, или ты спецом для ЛОРа это сделал?

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

За каким хером тебе Си сдался?

Для унификации: мелкоконтроллеры на сях пишу, веб-сервисы на сях пишу, числодробилки тоже на сях. И не нужно 100500 языков учить. Все одним решается.

Глаза разуй, у тебя ld выдает сообщения на русском языке

Правильно. Я ж русский! LC_MESSAGES у меня "ru_RU.koi8r". И свои велосипеды я с геттекстом пишу, они тоже по-русски "разговаривают".

Почитай про twisted, оно тебе может помочь с асинхронностью.

Ужас какой! Это что — жабкоскрипт???

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

Для унификации: мелкоконтроллеры на сях пишу, веб-сервисы на сях пишу, числодробилки тоже на сях. И не нужно 100500 языков учить. Все одним решается

Для унификации: скворечники молотком колочу, зубы чищу молотком, борщ ем тоже молотком. И не надо клешню разжимать.

Скажи, ты же в IT работаешь по большой нужде, да? Тебе нафиг не надо себя чем-то обременять, что-то читать, чем-то интересоваться, главное - отсидеть свои часы в своей шараге, получить свои 17к в месяц, и чтобы никто не трогал, и чтобы ни о чем не думать, да? И если можно было бы зарабатывать 20к к примеру библиотекарем, ты ничтоже сумняшеся бросил бы все это к чертям собачьим?

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