사용자 공간 프로그램이 프로그램과 데이터를 전송하기 위해 sysfs 또는 procfs 파일을 제공/구현할 수 있습니까?

사용자 공간 프로그램이 프로그램과 데이터를 전송하기 위해 sysfs 또는 procfs 파일을 제공/구현할 수 있습니까?

/sys커널 공간 장치 드라이버는 일반적으로 전달되거나 표시되는 디렉터리와 파일을 구현합니다 /proc. 오랫동안 실행되는 사용자 공간 프로그램도 이를 수행할 수 있습니까?

일부 데이터를 쿼리하고 런타임 시 외부 프로그램에서 일부 데이터를 설정할 수 있어야 하는 데몬이나 장기 실행 프로그램이 있습니다.
전체 소켓 인터페이스를 수행할 수 있지만 이는 프로그램과 외부 요청자에게 많은 오버헤드가 됩니다.
Linux 커널 개발자가 발견한 것처럼 "모든 것이 파일입니다" 모델을 사용하는 것은 커널 설정을 조정하는 데 매우 유용합니다. 나도 똑같은 일을 하고 싶다.

어떤 사람들은 디렉토리를 커널의 신성한 공간으로 생각할 수도 있지만 /sys"시스템"과 다른 서비스/서버/응용 프로그램 사이의 중요한 경계는 보이지 않습니다.

퓨즈를 사용하세요... 나는 "USERspace의 파일 시스템" 패키지 libfuse3.so인 FUSE를 사용하기로 결정했습니다. (래퍼를 작성한 후...) 각 액세스 변수/파일에 대해 하나씩 구조체 배열을 정의할 수 있습니다.

struct fileObj files[] = {
  {"mode", mode, getFunc, putFunc},
  {"numbProcs", numbProcs, getFunc, putFunc},
  {"svrHostPort", hostPort, getFunc, putFunc},
  {"somethingWO", jakeBuf, NULL, putFunc},  // Write only file (why?)
  {"timestamp", NULL, getTimestampFunc, NULL},  // Returns timestamp, R/O
  {0}
};

FUSE 파일 시스템의 마운트 지점은 "/ssm/fuse"... "ls -l"은 "files" 배열의 각 항목이 파일로 표시되고 일부는 R/O이고 일부는 R/W임을 나타냅니다. , 하나는 W/O입니다. "get" 함수 위치의 "getTimestampFunc"는 특수 함수가 파일과 연결되어 계산된 응답을 수행할 수 있음을 나타냅니다.

ribo@box:~/c$ ls -l /ssm/fuse
total 0
-rw-r--r-- 1 ribo ribo 10 Dec 28 17:17 mode
-rw-r--r-- 1 ribo ribo  1 Dec 28 17:17 numbProcs
--w------- 1 ribo ribo  3 Dec 28 17:17 somethingWO
-rw-r--r-- 1 ribo ribo  5 Dec 28 17:17 svrHostPort
-r--r--r-- 1 ribo ribo 32 Dec 28 17:17 timestamp
ribo@box:~/c$ cat /ssm/fuse/timestamp
18/12/28 17:17:27ribo@box:~/c$cat  /ssm/fuse/mode
hyperSpeedribo@box:~/c$ echo slow >/ssm/fuse/mode
ribo@box:~/c$ cat  /ssm/fuse/mode
slow

"echo >"는 프로그램에 값을 전달하는 것을 보여줍니다. 따라서 프로그램이 실행되는 동안 프로그램의 다양한 매개변수를 보고 확인하는 것이 쉽습니다.

답변1

커널 외부에 항목을 추가하거나 항목을 추가할 수 있는 방법은 없다고 생각합니다 /sys. 어차피 별 의미가 없기 /proc때문에 kobject 데이터 구조를 직접적으로 표현한 것입니다./sys

그러나 예를 들어 FIFO를 사용하여 사용자 공간에서 유사한 인터페이스를 제공할 수 있습니다.mkfifo더 알아보기. FIFO sysvinit에서 구현을 볼 수 있습니다 initctl.

답변2

물론 그럴 수 있습니다. 당신은 설치할 수 있습니다아무것(실제 디스크 파일 시스템, 회로 차단기 파일 시스템, overlayfs, tmpfs, 바인드 마운트 등) /sys또는 /proc커널에서 제공하는 인터페이스를 확장 및/또는 교체합니다.

이것이 좋은 생각인지 아닌지는 전혀 다른 문제입니다.

예:

# unshare -m
# touch /tmp/foo
# mount -B /tmp/foo /proc/1/status
# echo FOR GREAT JUSTICE > /proc/1/status
# cat /proc/1/status

관련 정보