多次使用socketpair函数的文件描述符时出现“错误文件描述符”错误

问题描述:

以下代码使用套接字对将子进程的消息发送给其父项。多次使用socketpair函数的文件描述符时出现“错误文件描述符”错误

#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的文件描述符没有区别。我认为它正在使用管道,因为我的完整程序的另一部分出现错误。 接受的答案解决了我的问题。

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

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

+0

感谢您的回答和建议。 它工作,如果我删除所有调用关闭功能,我用这种方法,因为这就是我在大多数例子中发现:关闭调用这两个文件描述符,在子进程和父进程。 此外,使用管道时,即使对关闭功能的所有调用也能正常工作,只是为了好奇:你知道为什么吗? – 2011-03-28 09:34:33

+0

@Mkfnx:没有。我很惊讶它可以与管道一起工作。 – 2011-03-28 09:35:58

+0

@Mkfnx:您是否确认在使用“pipe()”替换“socketpair()”系统调用时它可以工作?我同意Larsmans,这很奇怪......是不是有对“dup()”或“dup2()”的调用?再见! – 2011-03-28 12:25:49