Virtual Jail(이하 V_Jail)을 만들 때 꼭 필요하던 것이었는데 우연히 Begging Linux Programming 4th Edition  목차를 보고 발견!
이 글은 한 프로세스가 서버가 되고 다른 한 프로세스가 클라이언트가 되어 서로 통신을 하는 방식입니다.
또 서버가 되는 프로세스는 데몬으로 작동합니다.
V_Jail에 적용시키기 전에 잠깐 테스트 삼아 만든 코드라서 불필요한 내용도 있고 틀린 곳도 있습니다.

헤더파일인 fifo.h 소스코드


#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>

#define SV_FIFO_NAME "/tmp/fifo/sv_fifo"    // 서버가 읽고 쓸 fifo 파일 경로
#define CL_FIFO_NAME "/tmp/fifo/cl_%d_fifo"  // 클라이언트가 읽고 쓸 fifo 파일 경로
struct data_to_pass_st
{
pid_t client_pid;
};


 


서버가 될 fifotest1 의 소스코드


#include "fifo.h"
#include <ctype.h>

int main()
{
        int sv_fifo_fd, cl_fifo_fd;
        struct data_to_pass_st fifo_data;
        int read_res;
        char cl_fifo[256];
        char test[128];

        mkfifo(SV_FIFO_NAME, 0777);
        sv_fifo_fd = open(SV_FIFO_NAME, O_RDONLY);
        if (sv_fifo_fd == -1)
        {
                exit(EXIT_FAILURE);
        }


        while(1)  // 지속적으로 서버역활을 하기 위해 계속 작동
        {
                read_res = read(sv_fifo_fd, &fifo_data, sizeof(fifo_data));
                if (read_res >  0)
                {
                        sprintf(cl_fifo, CL_FIFO_NAME, fifo_data.client_pid);
                        cl_fifo_fd = open(cl_fifo, O_WRONLY);

                        if(cl_fifo_fd != -1)
                        {
                                sprintf(test, "touch /tmp/fifo/success%d", fifo_data.client_pid);
                                // 클라이언트의 PID로 통신 성공의 의미로 파일 생성
                                // 이 if 문 안에는 서버측에서 클라이언트가 보낸 데이터를 읽어들였을 때 실행될 코드
                                system(test);
                                write(cl_fifo_fd, &fifo_data, sizeof(fifo_data));
                                close(cl_fifo_fd);
                        }
                }
        }
        close(sv_fifo_fd);
        unlink(SV_FIFO_NAME);
        exit(EXIT_SUCCESS);
}


클라이언트가 될 fifotest2 의 소스코드

#include "fifo.h"
#include <ctype.h>

int main()
{
        int sv_fifo_fd, cl_fifo_fd;
        struct data_to_pass_st fifo_data;

        char cl_fifo[256];

        sv_fifo_fd = open(SV_FIFO_NAME, O_WRONLY);
        if(sv_fifo_fd == 1)
        {
                exit(EXIT_FAILURE);
        }

        fifo_data.client_pid = getppid();
        sprintf(cl_fifo, CL_FIFO_NAME, fifo_data.client_pid);
        if(mkfifo(cl_fifo, 0777) == -1)
        {
                exit(EXIT_FAILURE);
        }

        write(sv_fifo_fd, &fifo_data, sizeof(fifo_data));
        cl_fifo_fd = open(cl_fifo, O_RDONLY);
        if(cl_fifo_fd != -1)
        {
                if(read(cl_fifo_fd, &fifo_data, sizeof(fifo_data)) > 0 )
                {
                        printf("Success!\n");
                        // 서버측에서 통신을 성공했고 클라이언트 측에서도 통신이 성공하면 실행될 코드
                }
                close(cl_fifo_fd);
        }
        close(sv_fifo_fd);
        unlink(cl_fifo);
        exit(EXIT_SUCCESS);
}



실행 확인

 
언어도 제대로 모르는 상태에서 급하게 습득한 내용들이라서 제대로된 설명을 쓰기가 어렵내요.
참고자료는 위에 적혀있는 Begging Linux Programming 4th Edition과 구글링을 이용했습니다.

' 2016년 이전 > Progamming' 카테고리의 다른 글

[펌]우분투에서 OpenCV 설치  (0) 2016.07.23
[C언어] 심심해서 만든 숫자 찾기  (0) 2011.11.30

+ Recent posts