mkfifo()
저는 gcc를 컴파일러로 사용하고 Ubuntu 18 및 16 환경에서 C 언어로 명명된 파이프를 생성하고 있습니다 open()
. 내가 알아차린 한 가지는 프로세스가 끝난 후에도 명명된 파이프가 파일 시스템에 남아 있다는 것입니다. while(1)
내 요구 사항으로 인해 내 프로세스는 무한 루프에서 실행되는 프로세스이며 종료할 수 있는 유일한 방법은 ctrl-c 또는 kill
Linux의 명령입니다. 이러한 경우를 올바르게 처리하기 위해 ctrl-c 신호를 추가할 수도 있지만 이는 문제가 아닙니다.
명명된 파이프가 파일 시스템(예 /tmp/named_pipe1
: )에 남아 있는 경우 명명된 파이프가 파일 시스템에 있는지 확인하고 프로세스 시작 시 이를 삭제해야 합니까(파일이 시스템에 남아 있으므로)? 파일이 파일 시스템에 남아 있어도 버퍼도 삭제되므로 중복되므로 새 FIFO처럼 사용할 수 있습니까? 마지막 코드 실행을 종료하고 새 코드를 시작하기 위해 ctrl-c를 누를 때 fifo 버퍼가 혼합되는 것을 원하지 않기 때문입니다. 코드를 다시 시작하면 빈 버퍼가 필요합니다.
노트:시스템은 프로세스 간에 재부팅되지 않습니다. 프로세스를 다시 실행하면 됩니다.
미리 감사드립니다.
답변1
FIFO를 파괴하기 위해 첫 번째 함수 호출을 수행합니다. 통화가 실패하더라도 전혀 상관하지 않습니다. 그런 다음 호출합니다 mkfifo()
(반환 값을 확인하여 작업이 성공했는지 확인하세요.
첫 번째 호출에는 unlink()
다음 구문이 있습니다.
#include <unistd.h>
int unlink(const char *pathname);
MAN 페이지에 대한 설명은 다음과 같습니다.
unlink() 파일 시스템에서 이름을 제거합니다. 해당 이름이 파일에 대한 마지막 링크이고 해당 파일이 열려 있는 프로세스가 없으면 파일이 삭제되고 해당 파일이 사용하는 공간을 다시 사용할 수 있게 됩니다.
해당 이름이 파일에 대한 마지막 링크이지만 프로세스에 여전히 파일이 열려 있는 경우 해당 파일을 참조하는 마지막 파일 설명자가 닫힐 때까지 파일은 그대로 유지됩니다.
이름이 심볼릭 링크를 참조하는 경우 링크가 제거됩니다.
이름이 소켓, FIFO 또는 장치를 참조하는 경우 해당 이름은 삭제되지만 개체를 연 프로세스는 해당 이름을 계속 사용할 수 있습니다.
반환 값 성공하면 0이 반환됩니다. 오류가 발생하면 -1이 반환되고 errno가 적절하게 설정됩니다.
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
*설명 mkfifo()는 pathname이라는 FIFO 특수 파일을 생성합니다. 모드는 FIFO의 권한을 지정합니다. 일반적인 방법으로 프로세스의 umask에 의해 수정됩니다. 생성된 파일의 권한은 (mode & ~umask)입니다.
FIFO 특수 파일은 다르게 생성된다는 점을 제외하면 파이프와 유사합니다. 익명 통신 채널 대신 mkfifo()를 호출하여 FIFO 특수 파일이 파일 시스템에 입력됩니다.
이런 방식으로 FIFO 특수 파일이 생성되면 모든 프로세스에서 일반 파일처럼 읽거나 쓰기 위해 해당 파일을 열 수 있습니다. 그러나 입력 또는 출력 작업을 수행하려면 먼저 양쪽 끝이 열려 있어야 합니다. 읽기 위해 FIFO를 열면 일반적으로 다른 프로세스가 쓰기를 위해 동일한 FIFO를 열 때까지 차단되며 그 반대의 경우도 마찬가지입니다. FIFO 특수 파일의 비차단 처리에 대해서는 fifo(7)를 참조하십시오. *
반환 값 mkfifo() 및 mkfifoat()는 성공하면 0을 반환합니다. 오류가 발생하면 -1이 반환됩니다(이 경우 errno가 적절하게 설정됨).