当使用socketpair函数的文件描述符不止一次时,“错误的文件描述符”错误

时间:2011-03-28 09:09:50

标签: c linux sockets unix ipc

以下代码使用套接字对从子进程向其父进程发送消息。

#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;
}

首先,我尝试在进入for循环之前获取套接字对的文件描述符,并且单次调用socketpair函数,例如注释行显示,但这仅适用于第一次迭代,从第二次迭代开始我得到一个“错误的文件描述符错误”,我的工作方式是在for循环中移动socketpair函数调用,但是第一种方法在使用管道时对我有效。

所以我想知道为什么会这样,<罢工>我犯了错误吗? 或者这是两种IPC机制之间的区别吗?

由于

更新:管道和socketpair的文件描述符之间没有区别。我认为它正在使用管道,因为我的完整程序的另一部分出错。 接受的答案解决了我的问题。

1 个答案:

答案 0 :(得分:1)

您正在关闭父级和子级socketpair的两端。

通常,每个子进程使用一个套接字对或管道。