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 |