비차단 읽기/쓰기 기능이 있는 드라이버를 만들고 싶습니다. 파이프라인0의 입력은 파이프라인1의 출력에 연결됩니다. 데이터는 write()
지연 후 파이프에 기록됩니다(커널 타이머 또는 작업 대기열 사용). 쓰기 대기 시간은 를 통해 제어(가져오기 및 설정)해야 합니다 ioctl()
. 마지막으로 읽기/쓰기 버퍼 크기를 1B, 1KB, 1MB로 설정하고 대기 시간을 0.1밀리초 1초로 설정하여 드라이버의 처리량을 측정하고 싶습니다.
Linux용 드라이버를 만드는 방법에 대한 몇 가지 튜토리얼을 읽었습니다.
그러나 다음과 같은 문제에 직면하고 있습니다.
- 프로세스가 출력을 생성할 때마다 드라이버가 버퍼를 읽어야 하도록 드라이버를 먼저 생성하려면 어떻게 해야 합니까?
- 이 버퍼의 데이터를 다른 실행 프로그램의 입력으로 어떻게 전달할 수 있습니까?
기본적으로 "지연이 있는 파이프라인 드라이버"를 만들어야 합니다.
일반 파이프에는 "|" 기호를 사용합니다. 내 드라이버를 구현하려는 경우 "a|b"와 같은 자체 기호를 어떻게 만들 수 있습니까? ("a"는 버퍼 크기이고 "b"는 설정된 지연입니다)
그것은 다음과 같습니다:ls myfile.txt 20|5 wc
위의 예에서 20은 20KB 버퍼 크기이고 5는 5ms 대기 시간입니다.
답변1
첫째, 시스템은 일반적으로 기본값이 1MB인 FIFO 크기를 관리합니다. 를 이용하여 확인하거나 변경할 수 있습니다 sysctl fs.pipe-max-size [newsize]
. 여기에는 새로운 절차가 필요하지 않습니다.
또한 원하는 프로그램을 적용하기 위해 휠, 커널 또는 셸을 다시 만들 필요가 없습니다. 이 아이디어를 추구하기로 결정했다면 를 실행하세요 command | yourbufferprogram | othercommand
.
이 프로그램을 작성하려면 popen()
데이터를 버퍼링하고 처리량을 계산하기 위한 시스템 호출과 메모리 제어만 필요합니다. 한 번 시도해 보시고 막히면 더 구체적인 질문을 게시해 주세요.스택 오버플로.
마지막으로, 예상보다 많은 입력 데이터가 있는 경우 이러한 버퍼로 인해 메모리 사용량이 빠르게 폭발할 수 있다는 점에 유의하세요!