다음 코드는 소켓 쌍을 사용하여 자식 프로세스에서 부모 노드로 메시지를 보냅니다.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의의 파일 기술자 사이에는 차이가 없습니다. 전체 프로그램의 다른 부분에서 오류가 발생했기 때문에 파이프로 작업하고 있다고 생각했습니다. 대답이 내 문제를 해결했습니다.
답변과 제안에 감사드립니다. Close 함수에 대한 모든 호출을 제거하면 작동합니다. 그 접근법은 대부분의 예제에서 발견 되었기 때문에 사용되었습니다. 자식 및 부모 프로세스의 두 파일 설명자 모두를 가까이서 호출합니다. 또한 파이프를 사용할 때 호기심을 위해 닫기 함수를 호출 할 때조차도 작동합니다. 왜 그런지 알고 있습니까? –
@Mkfnx : 아니요. 파이프와 함께 작동한다는 것은 매우 놀랍습니다. –
@Mkfnx : "socketpair()"시스템 호출을 "pipe()"로 대체 할 때 작동하는지 확인합니까? 나는 Larsmans에 동의한다. 그것은 매우 이상하다. "dup()"또는 "dup2()"에 대한 호출이 없습니까? 안녕! –