多次使用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
的两端。
通常,每个子进程使用一个套接字对或管道。
感谢您的回答和建议。 它工作,如果我删除所有调用关闭功能,我用这种方法,因为这就是我在大多数例子中发现:关闭调用这两个文件描述符,在子进程和父进程。 此外,使用管道时,即使对关闭功能的所有调用也能正常工作,只是为了好奇:你知道为什么吗? – 2011-03-28 09:34:33
@Mkfnx:没有。我很惊讶它可以与管道一起工作。 – 2011-03-28 09:35:58
@Mkfnx:您是否确认在使用“pipe()”替换“socketpair()”系统调用时它可以工作?我同意Larsmans,这很奇怪......是不是有对“dup()”或“dup2()”的调用?再见! – 2011-03-28 12:25:49