[mkfifo]named pipe 예제 (unlink) 파이프, 피포
[제가 생각한 부분들이 잘 못된것이면 댓글로 조언 부탁드립니다.]
리눅스 processor와 통신을 할 일이 있어 참조하여 만들었습니다.
shell 에서 전달되는 문자를 구분하여 뭔가 다른 동작을 만들고 싶은 경우 사용할 수 있습니다.
아래 블로그를 참고하여 만들었습니다.
http://mycpp.blog.me/120095869914
위 블로그를 참고하여 기본적으로 동작 시킨 후 만약 예외 사항으로 프로세서가 죽는 경우
다시 진입 시 이전에 만든 파이프파일이 있으면 mkfifo 가 실패하게 됩니다.
하여 아래 코드를 보면 진입 시 먼저 실패 하는 경우 unlink를 한번 하여주고 만드는 것으로 넣었습니다.
----------------------------------------------실제코드 예제 코드----------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
if(mkfifo((char*)FIFO, 0777) == -1) {
MSG_HIGH("[namedFifo] mkfifo failed",0,0,0);
if( unlink((char*)FIFO) == -1){
MSG_HIGH("[namedFifo] First Failed to remove fifo",0,0,0);
}
if(mkfifo((char*)FIFO, 0777) == -1) {
MSG_HIGH("[namedFifo] mkfifo failed 22",0,0,0);
return;
}
}
if((fd=open(FIFO, O_RDWR)) == -1) {
MSG_HIGH("[namedFifo] open failed",0,0,0);
return;;//여기서 블로그 작성하면서 보니...에러 처리하면서 unlink 를 안해주네요....]
}
while(1) {
/* fifo로부터 읽기 */
if(read(fd, buffer, 128) == -1) {
MSG_HIGH("[namedFifo] read failed",0,0,0);
return;//여기서 블로그 작성하면서 보니...에러 처리하면서 unlink 를 안해주네요....]
}
int compareResult = strncmp(buffer, "quit", 4);
MSG_HIGH("[namedFifo] compareResult %d",compareResult,0,0);
/* quit */
if( compareResult == 0){
MSG_HIGH("[namedFifo] quit ",0,0,0);
close(fd);
if( unlink((char*)FIFO) == -1){
MSG_HIGH("[namedFifo] Failed to remove fifo",0,0,0);
}
return;
}
MSG_HIGH("[namedFifo] receive message: %s\n",buffer,0,0);
}
}
-----------------------Shell에서 문자 전달----------------------------------------------------------------------------------------------------
e> echo "quit" > namedfifotest
위와 같이 전달하면 종료 루틴으로 들어갑니다.
e> echo "testcmd" > namedfifotest
그외에는 로그로만 나오겠죠.
----------------------------------------------------------------------------------------------------
참고로 위 코드만드로 실행안되는 것 아시죠?
main() 에서 함수 호출 하거나 thread 에서 위 코드를 실행 시키면 됩니다.
사용 예제로 보시면 됩니다.
참고로 unlink 하는 부분은 위와 같이 여러곳에 만들지 말고 하나의 함수로 처리해서 호출 시키는 것이 좋겠네요
이렇게 사용하는 것이구나 정도로 참고하세요.
mkfifo / unlink 함수에 대한 내용은 아래 블로그 참고하세요.
http://mycpp.blog.me/120095869914
----------------------------------------------------------------------------------------------------
As per POSIX, unlink
can be found in the unistd.h
header file:
The sys/stat.h
header only defines such things as are required for using the return result of fstat()
, lstat()
and stat()
.
(http://stackoverflow.com/questions/19131266/c-unlink-was-not-declared-in-this-scope)
'IT > Linux' 카테고리의 다른 글
[Ubuntu] Eclips CDT (C, CPP, C++) 환경설정 (0) | 2016.08.18 |
---|---|
Ubuntu Java SDK : Remove and Install (우분투 자바 설치 및 삭제) (1) | 2016.08.18 |
Ubuntu Client Shortcuts(Ubuntu 단축키) (0) | 2016.05.01 |
[Eclipse Setting] Thread link error (0) | 2015.11.25 |
[AGL 공부] qemu 시뮬에 Hello world 올리기 (0) | 2015.11.15 |