以下代码使用套接字对将消息从子进程发送到其父进程。
#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循环内移动套接字对函数调用,但是使用管道时,第一种方法对我有用。
所以我想知道为什么会这样,我犯错了吗?
还是这两种IPC机制之间有区别?
谢谢
更新: pipe和socketpair的文件描述符之间没有区别。我以为它正在使用管道,因为我的整个程序的另一部分出错。
接受的答案解决了我的问题。
最佳答案
您正在关闭父级和子级中socketpair
的两端。
通常,每个子进程使用一个套接字对或管道。
关于c - 多次使用套接字对函数的文件描述符时,出现“Bad file descriptor”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5456805/