목차
FIFO에서 데이터 읽기: " >FIFO에서 데이터 읽기:
向FIFO中写入数据:" >向FIFO中写入数据:
管道写端 pipe_read.c" >管道写端 pipe_read.c
管道读端 pipe_write.c" >管道读端 pipe_write.c
시스템 튜토리얼 리눅스 Linux 시스템의 명명된 파이프(FIFO)

Linux 시스템의 명명된 파이프(FIFO)

Feb 15, 2024 pm 01:40 PM
linux 리눅스 튜토리얼 리눅스 시스템 리눅스 명령 쉘 스크립트 임베디드리눅스 리눅스 시작하기 리눅스 학습

Linux 시스템은 다중 작업의 동시 실행을 지원하는 운영 체제로, 동시에 여러 프로세스를 실행할 수 있어 시스템 활용도와 효율성이 향상됩니다. 그러나 이러한 프로세스 간에 데이터 교환 및 협업이 필요한 경우 신호, 메시지 큐, 공유 메모리, 세마포어 등과 같은 일부 프로세스 간 통신(IPC) 방법을 사용해야 합니다. 그 중 유명한 파이프(FIFO)는 비교적 간단하고 강력한 IPC 방식으로, 두 개 이상의 프로세스가 파일의 내용과 형식에 상관 없이 파일을 통해 데이터를 전송할 수 있도록 해줍니다. 이 기사에서는 유명한 파이프의 생성, 열기, 읽기, 쓰기, 닫기 및 삭제를 포함하여 Linux 시스템의 명명된 파이프(FIFO) 방법을 소개합니다.

Linux 시스템의 명명된 파이프(FIFO)

이름이 없는 파이프 적용의 주요 제한 사항은 이름이 없으므로 선호도가 있는 프로세스 간 통신에만 사용할 수 있다는 것입니다. 이 제한은 이름이 지정된 파이프(이름이 지정된 파이프 또는 FIFO)가 도입된 후에 극복되었습니다. FIFO는 FIFO 파일 형식으로 파일 시스템에 존재하는 연결된 경로 이름을 제공한다는 점에서 파이프와 다릅니다. 이렇게 하면 FIFO를 생성하는 프로세스와 친화력이 없더라도 해당 경로에 접근할 수 있다면 FIFO를 통해(경로에 접근할 수 있는 프로세스와 생성한 프로세스 간) 통신이 가능하다. FIFO) 따라서 FIFO를 통한 상관관계가 없습니다. 프로세스도 데이터를 교환할 수 있습니다. FIFO는 선입선출(선입선출)을 엄격하게 따른다는 점은 주목할 가치가 있습니다. 파이프와 FIFO에서 읽으면 항상 처음부터 데이터가 반환되고, 여기에 쓰면 끝에 데이터가 추가됩니다. lseek()와 같은 파일 위치 작업을 지원하지 않습니다.
파이프의 버퍼는 제한되어 있습니다(파이프 메커니즘은 메모리에 존재하며 파이프가 생성될 때 버퍼에 페이지 크기가 할당됩니다)
파이프라인이 전송하는 것은 형식화되지 않은 바이트 스트림입니다. 이를 위해서는 파이프라인의 판독기와 작성자가 메시지(또는 명령 또는 레코드)로 계산되는 바이트 수 등과 같은 데이터 형식에 미리 동의해야 합니다.

FIFO에는 여러 쓰기 프로세스와 하나의 읽기 프로세스가 있는 경우가 많습니다.

FIFO 개시 규칙:

  1. 현재 열기 작업이 읽기를 위해 FIFO를 여는 것이라면 해당 프로세스가 이미 쓰기를 위해 FIFO를 열었다면 현재 열기 작업은 성공적으로 반환됩니다. 그렇지 않으면 해당 프로세스가 쓰기를 위해 FIFO를 열 때까지 차단될 수 있습니다. 현재 열기 작업 차단 플래그가 설정되어 있음) 또는 성공적으로 반환됩니다(현재 열기 작업에 차단 플래그가 설정되어 있지 않음).
  2. 현재 열기 작업이 쓰기를 위해 FIFO를 여는 것이라면 해당 프로세스가 이미 읽기를 위해 FIFO를 열었다면 현재 열기 작업은 성공적으로 반환됩니다. 그렇지 않으면 해당 프로세스가 읽기를 위해 FIFO를 열 때까지 차단될 수 있습니다. 열기 작업 차단 플래그가 설정됨) 또는 ENXIO 오류가 반환됩니다(현재 열기 작업에 대해 차단 플래그가 설정되지 않음).

한 문장으로 말하자면, 차단 플래그가 설정되고 이를 설정하기 위해 mkfifo가 호출되면 파이프 양쪽 끝의 읽기 및 쓰기가 별도로 열려야 하며 어느 쪽이든 열려 있지 않으면 차단됩니다. 오픈이라고 합니다.

FIFO에서 데이터 읽기:

규칙: 프로세스가 FIFO에서 데이터를 읽기 위해 FIFO 열기를 차단하는 경우 프로세스 내의 읽기 작업을 차단 플래그가 설정된 읽기 작업이라고 합니다. (이제 데이터를 읽기 위해 유명한 파이프를 열고 싶다는 의미입니다!)

FIFO를 열기 위해 프로세스가 쓰고 현재 FIFO에 데이터가 없는 경우(파이프의 양쪽 끝이 설정되었지만 쓰기 끝이 아직 데이터 쓰기를 시작하지 않은 것으로 이해할 수 있습니다!)

  1. 그런 다음 차단 플래그가 설정된 읽기 작업의 경우 항상 차단됩니다(즉, 차단되고 데이터를 기다리고 있습니다. CPU 리소스를 소비하지 않습니다. 이 프로세스 동기화 방법은 CPU에 매우 효율적입니다.)
  2. 차단 플래그를 설정하지 않은 읽기 작업의 경우 -1이 반환되고 현재 errno 값은 EAGAIN이므로 나중에 다시 시도하도록 알려줍니다.

차단 플래그가 설정된 읽기 작업의 경우(위 규칙 참조)
방해하는 이유는 두 가지입니다

  1. FIFO内有数据,但有其它进程在读这些数据
  2. FIFO内没有数据。解阻塞的原因则是FIFO中有新的数据写入,不论信写入数据量的大小,也不论读操作请求多少数据量。

读打开的阻塞标志只对本进程第一个读操作施加作用,如果本进程内有多个读操作序列,则在第一个读操作被唤醒并完成读操作后,其它将要执行的读操作将不再阻塞,即使在执行读操作时,FIFO中没有数据也一样,此时,读操作返回0。

注:如果FIFO中有数据,则设置了阻塞标志的读操作不会因为FIFO中的字节数小于请求读的字节数而阻塞,此时,读操作会返回FIFO中现有的数据量。

向FIFO中写入数据:

约定:如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。

对于设置了阻塞标志的写操作:

  1. 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果此时管道空闲缓冲区不足以容纳要写入的字节数,则进入睡眠,直到当缓冲区中能够容纳要写入的字节数时,才开始进行一次性写操作。(PIPE_BUF ==>> /usr/include/linux/limits.h)
  2. 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。FIFO缓冲区一有空闲区域,写进程就会试图向管道写入数据,写操作在写完所有请求写的数据后返回。

对于没有设置阻塞标志的写操作:

  1. 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。在写满所有FIFO空闲缓冲区后,写操作返回。
  2. 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果当前FIFO空闲缓冲区能够容纳请求写入的字节数,写完后成功返回;如果当前FIFO空闲缓冲区不能够容纳请求写入的字节数,则返回EAGAIN错误,提醒以后再写;

简单描述下上面设置了阻塞标志的逻辑
设置了阻塞标志

if (buf_to_write then
 if ( buf_to_write > system_buf_left ) //保证写入的原子性,要么一次性把buf_to_write全都写完,要么一个字节都不写!
 then
  block ;
  until ( buf_to_write else
  write ;
 fi
else
 write ; //不管怎样,就是不断写,知道把缓冲区写满了才阻塞
fi
로그인 후 복사

管道写端 pipe_read.c

/pipe_read.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define FIFO_NAME "/tmp/my_fifo"
#define BUFFER_SIZE PIPE_BUF

int main()
{
int pipe_fd;
int res;

int open_mode = O_RDONLY;
char buffer[BUFFER_SIZE + 1];
int bytes = 0;

memset(buffer, '\0', sizeof(buffer));

printf("Process %d opeining FIFO O_RDONLY\n", getpid());
pipe_fd = open(FIFO_NAME, open_mode);
printf("Process %d result %d\n", getpid(), pipe_fd);

if (pipe_fd != -1)
{
do{
res = read(pipe_fd, buffer, BUFFER_SIZE);
bytes += res;
printf("%d\n",bytes);
}while(res > 0);
close(pipe_fd);
}
else
{
exit(EXIT_FAILURE);
}

printf("Process %d finished, %d bytes read\n", getpid(), bytes);
exit(EXIT_SUCCESS);
}
로그인 후 복사

管道读端 pipe_write.c

//pipe_write.c

#include   
#include   
#include   
#include   
#include   
#include   
#include   
  
#define FIFO_NAME "/tmp/my_fifo"  
#define BUFFER_SIZE PIPE_BUF  
#define TEN_MEG (1024 * 100)  
  
int main()  
{  
    int pipe_fd;  
    int res;  
    int open_mode = O_WRONLY;  
  
    int bytes = 0;  
    char buffer[BUFFER_SIZE + 1];  
  
    if (access(FIFO_NAME, F_OK) == -1)  
    {  
        res = mkfifo(FIFO_NAME, 0777);  
        if (res != 0)  
        {  
            fprintf(stderr, "Could not create fifo %s\n", FIFO_NAME);  
            exit(EXIT_FAILURE);  
        }  
    }  
  
    printf("Process %d opening FIFO O_WRONLY\n", getpid());  
    pipe_fd = open(FIFO_NAME, open_mode);  
    printf("Process %d result %d\n", getpid(), pipe_fd);  
  
   //sleep(20);
    if (pipe_fd != -1)  
    {  
        while (bytes if (res == -1)  
            {  
                fprintf(stderr, "Write error on pipe\n");  
                exit(EXIT_FAILURE);  
            }  
            bytes += res;  
        printf("%d\n",bytes);
        }  
        close(pipe_fd);  
    }  
    else  
    {  
        exit(EXIT_FAILURE);  
    }  
  
    printf("Process %d finish\n", getpid());  
    exit(EXIT_SUCCESS);  
}
로그인 후 복사

本文介绍了Linux 시스템의 명명된 파이프(FIFO)的方法,包括有名管道的创建、打开、读写、关闭和删除等方面。通过了解和掌握这些知识,我们可以更好地使用有名管道(FIFO)来实现进程间通信,提高系统的性能和可靠性。当然,Linux 시스템의 명명된 파이프(FIFO)还有很多其他的特性和用法,需要我们不断地学习和探索。希望本文能给你带来一些启发和帮助。

위 내용은 Linux 시스템의 명명된 파이프(FIFO)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Docker Desktop을 사용하는 방법 Docker Desktop을 사용하는 방법 Apr 15, 2025 am 11:45 AM

Docker Desktop을 사용하는 방법? Docker Desktop은 로컬 머신에서 Docker 컨테이너를 실행하는 도구입니다. 사용 단계는 다음과 같습니다. 1. Docker Desktop 설치; 2. Docker Desktop을 시작하십시오. 3. Docker 이미지를 만듭니다 (Dockerfile 사용); 4. Docker Image 빌드 (Docker 빌드 사용); 5. 도커 컨테이너를 실행하십시오 (Docker Run 사용).

Docker 프로세스를 보는 방법 Docker 프로세스를 보는 방법 Apr 15, 2025 am 11:48 AM

도커 프로세스보기 방법 : 1. Docker CLI 명령 : Docker PS; 2. Systemd Cli 명령 : SystemCTL 상태 Docker; 3. Docker Compose CLI 명령 : Docker-Compose PS; 4. 프로세스 탐색기 (Windows); 5. /Proc Directory (Linux).

Docker 이미지가 실패하면해야 할 일 Docker 이미지가 실패하면해야 할 일 Apr 15, 2025 am 11:21 AM

실패한 Docker 이미지 빌드에 대한 문제 해결 단계 : Dockerfile 구문 및 종속성 버전을 확인하십시오. 빌드 컨텍스트에 필요한 소스 코드 및 종속성이 포함되어 있는지 확인하십시오. 오류 세부 사항에 대한 빌드 로그를보십시오. -표적 옵션을 사용하여 계층 적 단계를 구축하여 실패 지점을 식별하십시오. 최신 버전의 Docker Engine을 사용하십시오. -t [image-name] : 디버그 모드로 이미지를 빌드하여 문제를 디버깅하십시오. 디스크 공간을 확인하고 충분한 지 확인하십시오. 빌드 프로세스에 대한 간섭을 방지하기 위해 Selinux를 비활성화하십시오. 커뮤니티 플랫폼에 도움을 요청하고 Dockerfiles를 제공하며보다 구체적인 제안을 위해 로그 설명을 구축하십시오.

VSCODE에 필요한 컴퓨터 구성 VSCODE에 필요한 컴퓨터 구성 Apr 15, 2025 pm 09:48 PM

대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

VSCODE는 확장자를 설치할 수 없습니다 VSCODE는 확장자를 설치할 수 없습니다 Apr 15, 2025 pm 07:18 PM

VS 코드 확장을 설치하는 이유는 다음과 같습니다. 네트워크 불안정성, 불충분 한 권한, 시스템 호환성 문제, C 코드 버전은 너무 오래된, 바이러스 백신 소프트웨어 또는 방화벽 간섭입니다. 네트워크 연결, 권한, 로그 파일, 업데이트 대 코드 업데이트, 보안 소프트웨어 비활성화 및 대 코드 또는 컴퓨터를 다시 시작하면 점차 문제를 해결하고 해결할 수 있습니다.

vScode를 Mac에 사용할 수 있습니다 vScode를 Mac에 사용할 수 있습니다 Apr 15, 2025 pm 07:36 PM

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.

VScode 란 무엇입니까? VScode 란 무엇입니까? Apr 15, 2025 pm 06:45 PM

VS Code는 Full Name Visual Studio Code로, Microsoft가 개발 한 무료 및 오픈 소스 크로스 플랫폼 코드 편집기 및 개발 환경입니다. 광범위한 프로그래밍 언어를 지원하고 구문 강조 표시, 코드 자동 완료, 코드 스 니펫 및 스마트 프롬프트를 제공하여 개발 효율성을 향상시킵니다. 풍부한 확장 생태계를 통해 사용자는 디버거, 코드 서식 도구 및 GIT 통합과 같은 특정 요구 및 언어에 확장을 추가 할 수 있습니다. VS 코드에는 코드에서 버그를 신속하게 찾아서 해결하는 데 도움이되는 직관적 인 디버거도 포함되어 있습니다.

Linux의 주요 목적은 무엇입니까? Linux의 주요 목적은 무엇입니까? Apr 16, 2025 am 12:19 AM

Linux의 주요 용도에는 다음이 포함됩니다. 1. 서버 운영 체제, 2. 임베디드 시스템, 3. 데스크탑 운영 체제, 4. 개발 및 테스트 환경. Linux는이 분야에서 뛰어나 안정성, 보안 및 효율적인 개발 도구를 제공합니다.

See all articles