Ошибка «неверный дескриптор файла», когда файловые дескрипторы функции socketpair используются более одного раза - PullRequest
1 голос
/ 28 марта 2011

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

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MESSAGE "Hello"

int main()
{ 
    char message[100];
    int i, pidFork, sockets[2];

    /*
     *Trying to use a single socketpair function call
     *
     *if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) {
     *   perror("Creating socketpair");
     *   exit(-1);
     *}
     */

    for(i=0; i<2; i++) { 

        if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) {
            perror("Creating socketpair");
            exit(-1);
        }

        printf("i: %d\n", i);
        pidFork = fork();
        if (pidFork == -1) {
            perror("Creating child process");
            exit(-1);
        }

        else if (pidFork != 0) { //Parent
            close(sockets[0]);
            if(read(sockets[1], message, strlen(MESSAGE)) == -1) {
                perror("Reading data");
                exit(-1);
            }
            printf("Data: %s\n\n", message);
            close(sockets[1]);
        }

        else { //Child
            close(sockets[1]);
            if(write(sockets[0], MESSAGE, strlen(MESSAGE)) == -1) {
                perror("Writing data");
                exit(-1);
            }
            close(sockets[0]);
            exit(0);
        }
    }
    return 0;
}

Сначала я попытался получить файловые дескрипторы для пары сокетов с помощью одного вызова функции socketpair перед входом в цикл for, например, показанные закомментированные строки, но это работает только для первой итерации, начиная со второй итерации. Я получаю «Ошибка неверного дескриптора файла», способ, которым я заставил его работать, - это перемещение вызова функции socketpair внутри цикла for, однако первый подход сработал для меня при использовании каналов.

Итак, я хотел бы знать, почему это происходит, Я ошибаюсь? Или это разница между обоими механизмами МПК?

Спасибо

Обновление: Нет разницы между файловыми дескрипторами pipe и socketpair. Я думал, что это работает с трубами, потому что ошибка в другой части моей полной программы. Принятый ответ решил мою проблему.

1 Ответ

1 голос
/ 28 марта 2011

Вы закрываете оба конца socketpair как в родительском, так и в дочернем элементах.

Как правило, используйте одну пару сокетов или канал для дочернего процесса.

...