CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): vinawara (우산장수)
날 짜 (Date): 2002년 10월 15일 화요일 오전 10시 32분 43초
제 목(Title): Re: [q] IPC performance (socket)?


저도 doors로 끼어들까 하다가 locking쪽으로 이야기가 흘러가기에 그냥 보고만
있었습지요.

doors라는건 local process간의 function call이 가능한 매커니즘정도로 
이해하면 되겠군요. ( LPC 정도면 될려나 )

named-stream(named-pipe 비슷한)에 function을 맵핑시켜서 다른 프로세스가
call할 수 있도록 하는것이지요. 성능은 꽤 믿을만한 수준으로 알고있습니다.
Linux port쪽에서 실험한 데이터로는 unix-domain socket, pipe등과 비교해서
제일높은 성능을 나타내었다더군요. 당연히, solaris의 application들도
door를 꽤 많이 이용하는것 같구요.

제가 있는 팀의 어떤분이 signal/sharedmem방식에서 signal loss가 발생해 
문제가 있던것을 door를 써서 해결 사례(?)도 있습니다.

( 스티븐아저씨의 UNP 2ND Ed.의 Vol.2 IPC에서도 한챕터를
할애에 설명이 되어있습니다. 보다 자세한 설명은 여길., 혹은
 man door_create 라고 하셔도 :)

ref.
Door Linux port : http://www.rampant.org/doors
Kernel 2.2까지만 포팅이 되었고 그 이후로는 프로젝트가 중단되었습니다.

대충의 예제는 아래와 같습니다. 

Server Side
---8<---
#include <stdio.h>
#include <door.h>

#define TEST_COOKIE ((void *)0xa4a4b5b5)
#define TESTDOOR    ".testdoor"

void server_proc(void *cookie, char *argp, size_t arg_size, door_desc_t *dp,
        size_t n_desc) 
{
    door_cred_t cred;

    printf("hi dude\n");
:    
    door_return((char *)"Hey man", strlen("Hey man"), NULL, 0);
}

main()
{
    int door, fd;

    if ((fd = creat(TESTDOOR, 0600))<0)
    {
        perror("creat");
        exit(1);
    }
    close(fd);

    if ((door = door_create(server_proc, (void *)TEST_COOKIE, 0))<0)
    {
        perror("door_create");
        exit(1);
    }
    fdetach(TESTDOOR);
    if (fattach(door, TESTDOOR)<0)
    {
        perror("fattach");
        exit(1);
    }
    printf("OK START Service\n");
    for(;;) 
        pause();
}


client side
---8<---
#include <fcntl.h>
#include <stdio.h>
#include <door.h>

#define TEST_COOKIE ((void *)0xa4a4b5b5)
#define TESTDOOR    ".testdoor"

main()
{
    door_arg_t  args;
    door_info_t info;
    int fd; 
    char res[255];

    if ((fd = open(TESTDOOR, O_RDONLY))<0)
    {
        perror("open");
        exit(1);
    }
    if (door_info(fd, &info)<0 )
    {
        perror("door_info");
        exit(1);
    }
    printf("fd = %d\n", fd);

    args.data_ptr = (char *) "HuHu Hi";
    args.data_size = sizeof("HuHu Hi");
    args.desc_ptr = NULL; 
    args.desc_num = 0;
    args.rbuf = res;
    args.rsize = sizeof(res);

    if (door_call(fd, &args)<0)
    {
        perror("door_call");
    }

    printf("args.rbuf = %s\n", args.rbuf);


=.
 사랑을 전하기엔 언어란 부자유한 것이지. 
 Keaton

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.