오늘 저는 sysctl 파일에 개행 문자를 명시적으로 쓰는 코드를 발견했습니다. Moby/Docker 참조소스 코드. 내 첫 번째 생각은 작성자가 개행 문자가 중복됨에도 불구하고 쉘의 동작을 복제하기 위해 열심히 노력했다는 것입니다.
하지만 그 주제에 대한 문서를 찾기 시작했고 어느 쪽이든 정보를 찾기가 어렵다는 것을 알게 되었습니다. 지금까지 나는 아무것도 알아내지 못했습니다.
sysctl 파일에 쓸 때 /proc/sys/
많은 값은 ASCII로 작성된 정수입니다. 예를 들어, 무언가를 켜거나 끄려면 파일에 1
또는 텍스트를 써야 합니다 .0
일반적으로 U&L, 블로그 등에 대한 조언은 셸에서 사용하라는 것입니다 echo
. 예를 들어 IPv4 전달을 활성화합니다.
echo 1 > /proc/sys/net/ipv4/ip_forward
하지만이 제안은 명시된 목표와 약간 다르게 작동합니다. 단일 바이트 0x31을 파일에 쓰지 않습니다. 0x31 0x0A 일명 이라고 씁니다 1\n
. 나는 항상 개행 문자(0x0A)가 커널에 의해 무시된다고 가정했습니다.
sysctl 파일(예 /proc/sys/net/ipv4/ip_forward
: )에 줄바꿈을 쓰면 영향이 있나요? 소스 코드에 대한 링크라도 인용은 환영합니다.
답변1
대부분의 경우 적어도 입력 문자열의 끝에서는 어느 쪽이든 차이가 없습니다. 모든 경우에 기록된 데이터만 처리됩니다. 커널은 제공된 버퍼의 길이( 1
줄바꿈 없는 1바이트, 1
줄바꿈 있는 2바이트)를 알고 해당 바이트만 처리합니다.
sysctl
입장 용도표준 sysctl
처리 기능개행 문자를 명시적으로 처리합니다.문자열에서는 입력을 종료합니다.,벡터에서는 항목을 구분합니다.(대부분의 수치값은 최종적으로 벡터로 처리되며,예를 들어 /proc/sys/net/ipv4/ip_forward
). 이는 항상 처리를 종료하는 사용자 입력 끝에 도달하는 것에 추가됩니다.
따라서 다음은 모두 동일한 결과를 생성합니다.
$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ printf 1 > /proc/sys/net/ipv4/ip_forward
$ printf '1\n0\n' > /proc/sys/net/ipv4/ip_forward
그래서 대답은
sysctl(/proc/sys) 파일에 개행 문자를 쓰면 어떤 영향이 있습니까?
예: 값의 끝을 나타냅니다. 이 표시는 전체 입력의 끝과 비교하여 정보를 추가할 수도 있고 추가하지 않을 수도 있습니다. 이는 컨텍스트(구체적으로 기록된 값이 벡터인지 여부)에 따라 다릅니다.
코드 처리산출을 위한 sysctl
,즉항목에서 콘텐츠를 읽을 때 읽은 텍스트를 생성하고 sysctl
예상대로 항상 종료 줄 바꿈을 추가합니다.
sysctl
실용적인 사항항상 개행 문자를 쓰세요, 따라서 이것이 대부분의 경우 계속 작동할 것이라고 가정하는 것이 안전합니다.
(확인해보진 않았습니다모두handlers sysctl
이므로 개행을 반대하는 특정 핸들러가 있을 수 있습니다. )