본문 바로가기

Studying!!/공부를하자

Pipe vs Shared Memory


 

1. Pipe



 

if(pipe(file_pipes)>=0)

        { 

                fork_result = fork(); 

                if(fork_result == -1){

                                fprintf(stderr, "Fork failure");

                                exit(EXIT_FAILURE);

                } 

                if(fork_result == 0){

                        sleep(1);

                        data_processed = read(file_pipes[0], buffer, sizeof(buffer));

                        printf("Read %d bytes : %s\n", data_processed, buffer);

                        exit(EXIT_SUCCESS);

                } 

                else{

                        data_processed = write(file_pipes[1], &some_data, 3);

                        printf("Wrote %d bytes\n", data_processed);

 

                } 

        } 

        exit(EXIT_SUCCESS);

 

 

if(pipe(file_pipes)>=0) 를 통해 파이프를 연다. 그리고 에러가 없다면, ( 0보다 큰 값을 리턴 하게 되면) fork한다.

부모 프로세스일 경우(else) 파이프에 some_data 3바이트만큼 write한다. 출력 시 파이프의 변수인 file_pipes[1]을 이용한다. 그리고 파이프에 쓴 바이트 수를 "Wrote %d bytes\n", data_processed  form으로 출력한다.

그리고 만약 자식 프로세스 일 경우(fork_result==0) 부모 프로세스에서 파이프에 some_data의 내용을 쓸 동안 기다리기 위해 1초간 sleep하고 파이프에서 read하여 buffer에 쓴다. 그리고 읽은 바이트 수와 버퍼에 쓴 내용을 "Read %d bytes : %s\n", data_processed, buffer form으로 출력한다.

 

 

 

 

 

 

2.Shared Memory

 

 

shm1.c

#define KEY_NUM 9527

int main()

{

        int running = 1;

        void *shared_memory = (void*)0;

        struct shared_use_st *shared_stuff;

        int shmid;

 

        srand((unsigned int)getpid());

 

        shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666 | IPC_CREAT);

        printf("%d", shmid);

        if(shmid == -1)

        { 

                fprintf(stderr, "shmget failed1\n");

                exit(EXIT_SUCCESS);

        } 

 

        shared_memory = shmat(shmid, (void *)0, 0);

        if(shared_memory == (void*)-1){

                fprintf(stderr, "shmat failed\n");

                exit(EXIT_FAILURE);

        } 

  

        shared_stuff = (struct shared_use_st *)shared_memory;

        shared_stuff->written_by_you = 0;

        while(running){

                if(shared_stuff->written_by_you){

                        printf("You wrote: %s", shared_stuff->some_text);

                        sleep(rand() % 4);

                        shared_stuff->written_by_you =0;

  

                        if(strncmp(shared_stuff->some_text, "end",3)==0){

                                running = 0;

                        } 

                } 

        } 

        if(shmdt(shared_memory)==-1){

                fprintf(stderr, "shmdt failed\n");

                exit(EXIT_FAILURE);

        } 

        if(shmctl(shmid, IPC_RMID,0)==-1){

                fprintf(stderr, "shmctl(IPC_RMID) failed\n");

                exit(EXIT_FAILURE);

        } 

 

        exit(EXIT_SUCCESS);

}

shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666|IPC_CREAT); 형태로 공유 메모리를 생성한다. KEY_NUM 은 상위에 define으로 세팅되어 있다.

 

생성된 공유 메모리는 shared_memory = shmat(shmid,(void *)0, 0);을 이용하여 연결한다.

 

만약 입력 받은 데이터가 0이면 if(strncmp(shared_stuff->some_text, "end",3)==0)

종료시킨다.

 

shmdt(shared_memory)를 통해 공유메모리 연결을 삭제한다.

 

Shmctl(shmid, IPC_RMID, 0)을 통해 공유메모리를 삭제한다.

 

 

 

 

 

 

shm2.c

#define KEY_NUM 9527

int main()

{

        int running = 1;

        void *shared_memory =(void*)0;

        struct shared_use_st *shared_stuff; 

        char buffer[BUFSIZ]; 

        int shmid;

 

        shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666|IPC_CREAT);

 

        if(shmid == -1){

                fprintf(stderr, "shmget failed\n");

                exit(EXIT_FAILURE);

        } 

 

        shared_memory = shmat(shmid,(void *)0, 0); //shmat();

        if(shared_memory == (void*)-1){

                fprintf(stderr, "shmat failed\n");

                exit(EXIT_FAILURE);

        } 

 

        printf("Memory attached at %X\n", (int)shared_memory);

 

        shared_stuff = (struct shared_use_st *)shared_memory;

        while(running)

        { 

                 while(shared_stuff->written_by_you==1){

                        sleep(1);

                        printf("waiting for client...\n");

                } 

                printf("Enter some text: ");

 

                fgets(buffer, BUFSIZ, stdin);

                                strncpy(shared_stuff->some_text, buffer, TEXT_SZ);

 

                shared_stuff->written_by_you = 1;

 

                if(strncmp(buffer, "end",3)==0){

                        running =0;

 

                }

        }

        if(shmdt(shared_memory)==-1){

                fprintf(stderr, "shmdt failed\n");

                exit(EXIT_FAILURE);

        }

        exit(EXIT_SUCCESS);

}

 

shmid = shmget((key_t)KEY_NUM, sizeof(struct shared_use_st), 0666|IPC_CREAT); 형태로 공유 메모리를 생성한다. KEY_NUM 1번 파일과 마찬가지로 define으로 설정되어 있다.

 

생성된 공유 메모리는 shared_memory = shmat(shmid,(void *)0, 0);을 이용하여 연결하고 연결 될 주소는 printf("Memory attached at %X\n", (int)shared_memory); format으로 출력한다.

 

 

while(shared_stuff->written_by_you==1){

                        sleep(1);

                        printf("waiting for client...\n");

}

을 이용하여 구조체의 written_by_you 의 값이 1이면 1초간 슬립하고 fgets(buffer, BUFSIZ, stdin); fgets를 이용하여 buffer에 입력한 내용을 쓴다.

 

strncpy(shared_stuff->some_text, buffer, TEXT_SZ);을 이용해 buffer을 공유 메모리에 쓰게 된다.

 

만약 입력받은 문자열이 end라면 if(strncmp(buffer, "end",3)==0) 종료시킨다.

 

shmdt(shared_memory)를 통해 공유메모리 연결을 삭제한다.

'Studying!! > 공부를하자' 카테고리의 다른 글

Op-Amp 기본  (0) 2010.10.13
트랜지스터  (1) 2010.10.06
어셈블리 Linked List Operation (insert/remove/sort/search/empty)  (0) 2008.11.18
Linux Scheduler 분석  (0) 2008.11.17
어셈블리 strcmp_length strcmp_byte 구현  (0) 2008.10.17