- 부모 - 자식 간이 아닌 독립적인 프로세스들은 서로의 존재 모름 -> 이름 있는 파이프 사용해야 함
- 특수 파일의 한 종류, FIFO라고 함
- FIFO로 사용할 특수 파일을 먼저 생성해야 함 (명령이나 함수로)
명령으로 FIFO 파일 생성 - mknod, mkfifo
mknod 명령
FIFO 파일 뿐 아니라 특수 파일도 생성하는 명령
mknod 파일명 p
$mknod HAN_FIFO p
$ls -F // FIFO file 목록
HAN_FIFO| //|이 FIFO 표시임
mkfifo 명령
FIFO 파일만 생성하는 명령
/usr/bin/mkfifo [-m mode] path 또는
mkfifo [-m mode] path
$mkfifo -m 0644 BIT_FIFO
함수로 FIFO 파일 생성 - mknod, mkfifo
#include <sys/stat.h>
#include <sys/types.h>
int mknod(const char *path, mode_t mode ,dev_t dev);
int mkfifo(const char *path, mode_t mode);
int main(){
mknod("HAN-FIFO", S_IFIFO|0644, 0);
mknod("BIT-FIFO", 0644);
}
- mknod
- path : 특수 파일 생성할 경로
- mode : 특수 파일 종류, 접근 권한 지정
- S_IFIFO : FIFO 특수 파일
- S_IFCHR : 문자 장치 특수 파일
- S_IFDIR : 디렉토리
- S_IFBLK : 블록 장치 특수 파일
- S_IFREG : 일반 파일
- 숫자 모드 직접 사용하는 것이 편함
- dev : 블록/문자 장치 설정값
- 생성하려는 특수 파일이 블록/문자 장치일 때만 의미 있음
- 성공하면 0, 실패하면 -1 리턴
- mkfifo
- path : FIFO 파일 생성할 경로
- mode : 접근 권한 지정
FIFO로 데이터 주고받기
server
int main(){
int pd, n;
char msg[] = "Hello, FIFO";
printf("server\n");
mkfifo("./FIFOFILE", 0666); //FIFO 파일 생성
pd = open("./FIFOFILE", O_WRONLY); //FIFO 파일 쓰기 모드로 열기
printf("to client: %s\n", msg);
n = write(pd, msg, strlen(msg)+1); //FIFO 파일에 문자열 출력
close(pd);
}
client
int main(){
int pd, n;
char inmsg[80];
pd = open("./FIFOFILE, O_RDONLY); //서버측에서 생성한 FIFO 파일 열기
printf("client\n");
write(1, "from server: ",13);
while((n = read(pd, inmsg, 80))>0) //서버가 보낸 데이터 읽기
write(1,inmsg,n);
printf("\n");
close(pd);
}