Закрыт ли дескриптор сокета функцией выхода (кодом выхода)? - PullRequest
3 голосов
/ 09 марта 2012

Я создал многопроцессный клиент-сервер на языке c-unix. Каждое соединение с клиентом управляется как дочерний процесс. Когда происходит ошибка, я просто вызываю функцию выхода (EXIT_FAILURE), потому что я прочитал, что эта функция закрывает все открытые потоки. Вопрос в том, должен ли я закрывать дескриптор сокета клиента, или закрытие происходит автоматически?

пример моего кода:

while(1){
    if((client_sock=accept(ds_sock,&client,&s_client))==-1){
        printf("Accept error\n");
        exit(EXIT_FAILURE);
    }
    if(fork()==0){  //child
        if((close(ds_sock)==-1)){
            printf("Closing error\n");
            exit(EXIT_FAILURE);
        }
        if((read(client_sock,&up,sizeof(userpass)))==-1){
            printf("Error read\n");
            exit(EXIT_FAILURE); //Does this instruction close the client_sock too?
        }

1 Ответ

3 голосов
/ 09 марта 2012

Вы должны закрыть сокет в родительском процессе, так как дескриптор дублируется после разветвления.

Вызов exit () автоматически закроет сокет в дочернем процессе, как вы уже подозревали.

Операционная система должна высвобождать все ресурсы процесса после его завершения, иначе системные ресурсы будут использованы плохо написанными программами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...