Вот такой вопрос: когда я делаю после 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);
		}
	}
Вопрос: как правильно закрывать сокеты?
Дополнительный вопрос: при работе в «приватном» режиме мне не нужны процессы — я хочу лишь запускать отдельные потоки подсоединяющимся «неприватным» клиентам и только отсылать им нужную часть информации, игнорируя прием (закрывать принимающий канал нельзя, а то клиент отвалится). Не будет ли здесь проблем с невесть откуда берущимися трубами или еще какой фигней?









