[mkfifo]named pipe 예제 (unlink) 파이프, 피포

Posted by [하늘이]
2016. 6. 16. 17:43 IT/Linux
반응형

[제가 생각한 부분들이 잘 못된것이면 댓글로 조언 부탁드립니다.]


리눅스 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>


#define FIFO "/test/namedfifotest"


void Test::test(){

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 POSIXunlink 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)

반응형