sysctl(/proc/sys) 파일에 개행 문자를 쓰면 어떤 영향이 있습니까?

sysctl(/proc/sys) 파일에 개행 문자를 쓰면 어떤 영향이 있습니까?

오늘 저는 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이므로 개행을 반대하는 특정 핸들러가 있을 수 있습니다. )

관련 정보