LINUX.ORG.RU

fork, sockets & zombie

 , ,


0

1

Вот такой вопрос: когда я делаю после accept в родительском процессе fork, закрываю вроде бы все ненужное и запускаю обработчик:

	while (1) {
		struct sockaddr_in remote;
		socklen_t sockaddr_len = sizeof(remote);
		int clientsocket = accept(listensocket, (struct sockaddr*)&remote, &sockaddr_len);
		if (clientsocket < 0) {
			perror("Accept failed");
			return EXIT_FAILURE;
		}
		printf("Connected %s:%d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port));
		switch(fork()){
		case -1:
			perror("fork");
			break;
		case 0:
			close(listensocket);
			close(0); close(1); close(2);
			client_worker(clientsocket);
			exit(0);
		default:
			close(clientsocket);
		}
	}
Однако, помимо открытого на свободном порту сокета, я вижу в /proc/ChildPID/fd симлинк на какую-то трубу [pipe:39128]. В результате чего после завершения дочернего процесса получается зомби, который висит, пока не помрет родительский.

Вопрос: как правильно закрывать сокеты?

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

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

Не было проблем.

Проблемы могут придти не ожиданно. Допустим, новая версия библиотки решит что-то вывести в stderr. Если он просто закрыт, то, скорее всего ничего не случится, библиотека проигнориует факт ошибки записи. Но, если ваш демон будет открывать файлы/пайпы, то третий файл получит файловый дескриптор 2 и весь вывод ошибок от библиотек.

Только у родителя и дочерних.

fork() не создаёт pipe. Хотя pipe вам мешать не должен, можете просто для порядку поискать в своём коде, откуда берётся этот pipe.

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

Спасибо. Думал, что за давностью останусь без ответа.

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