Следующий код отправляет сообщения от дочерних процессов своим родителям, используя пары сокетов.
#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. Я думал, что это работает с трубами, потому что ошибка в другой части моей полной программы.
Принятый ответ решил мою проблему.