socketpair

OS/리눅스 & 유닉스 2011. 12. 27. 19:05

1장. socketpair(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

연결된 소켓 쌍을 생성한다.


1.1절. 사용법

#include <sys/types.h>
#include <sys/socket.h>

int socketpair(int d, int type, int protocol, int sv[2]);
		


1.2절. 설명

socketpair()은 옵션으로 d영역(domain)을 가지며 protocol프로토콜을 사용하는 type의 소켓 쌍을 생성한다. 생성된 소켓 쌍은 sv를 통해서 넘어온다. 두개의 소켓은 서로 구별할 수 없다.

보통 부모 자식 프로세스간 내부 통신(IPC)를 위해서 사용한다. 소켓이므로 양방향(읽고/쓰기) 통신이 가능하다.


1.3절. 반환값

성공시 0을 반환하고 실패할 경우 -1을 반환한다.


1.4절. 에러

EMFILE

너무 많은 파일이 열려있어서 더이상 소켓을 생성할 수 없다.

EAFNOSUPPORT

지정한 주소 지정방식이 지원되지 않는다.

EPROTONOSUPPORT

지정된 프로토콜이 지원되지 않는다.

EFAULT

주소 ev가 프로세스 주소 공간의 유효한 부분을 가리키지 않는다.


1.5절. 예제

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>

int main()
{
    int pid;
    char buf[256];
    int fd;
    int sv[2];
    int num = 0;

    socketpair(AF_UNIX, SOCK_STREAM, AF_LOCAL, sv);
    pid = fork();
    if (pid == 0)
    {
        dup2(sv[0], 0);
        close(sv[1]);
        close(sv[0]);
        execl("./pipe_cl", "pipe_cl", NULL);
    }
    else if (pid > 0)
    {
        close(sv[0]);
        while(1)
        {
            write(sv[1], (void *)&num, 4);
            printf("write %d\n", num);
            read(sv[1], (void *)&num, 4);
            printf("read %d\n", num);
        }
    }
}
		
위 프로그램은 fork()한 후 자식프로세스에서 pipe_cl을 실행시킨다. 자식과 부모 프로세스는 소켓을 통하여 연결되고 이것을 통해서 데이터를 교환할 수 있다. 다음은 pipe_cl의 코드다.
#include <unistd.h>
#include <stdio.h>

int main()
{
    int num;
    while(1)
    {
        read(0, (void *)&num, 4);
        num++;
        write(0, (void *)&num, 4);
        sleep(1);
    }
}
		

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

유닉스 itoa 구현  (0) 2011.12.30
htonl() htons() ntohl() ntohs()  (0) 2011.12.28
파일 디스크립터  (0) 2011.12.27
perror  (0) 2011.12.23
write  (0) 2011.12.23
: