2009-08-10 4 views
5

Linux write() 함수에서 상당히 높은 수준에서 0 길이 버퍼를 쓰는 요청을 필터링합니다. 어떤 의미가 있습니다. OS를 수행하는 데 필요한 작업이 없다는 것을 결정하기 위해 레이어를 드릴링하는 시간을 낭비하는 OS를 원했던 사람은 누구입니까?길이가 0 인 write()를 호출하면 어떤 결과가 발생합니까?

음 ... 나.

관련 항목 : question; 핸드 셰이 킹이 잘못된 경우 주소 (버스 전 데이터로 전송)가 오류를 발생시키는 경우 비트 밴싱 된 I2C 드라이버가 잠재적으로 유용한 리턴 코드를 제공한다는 사실을 발견했습니다.

주소 뒤에 더미 데이터를 보낼 수는 있지만 사용중인 장치에서는 보낼 수 없습니다. (아마 나는 읽으려고 노력할 것이다. ..).

그래서 질문은 : 커널이 길이가 0 인 쓰기를 허용한다면 어떤 종류의 지옥이 풀릴 것입니까?

답변

2

단지 폐쇄를 위해 워렌 영 (Warren Young)이 드라이버를 업데이트하고 패치를 게시하는 아이디어에 착수했습니다 (라운드가 tuit 일 때).

+0

그리고 이것은 결국 우리의 나머지 부분을 도움이 될 것입니다. 고맙습니다 –

0

하지 심각한 대답 : 당신은 touch 같은 프로그램을 얻을 수 있습니다 : P를

1

아주 작은, 나는 생각할 것 - 길이가 0 인 쓰기 차단 할 가능성이있을 경우가 쓰고 버퍼 일부 드라이버에는 사용 가능한 공간이 없습니다. 길이가 0 인 쓰기를 허용하지 않으면 그와 같은 경우에 작업이 더 간단해질뿐만 아니라 많은 낭비되는 작업을 피할 수 있습니다.

왜 그 수표를 지우고 어떤 종류의 지옥이 실제로 느슨한 지 알아 보시겠습니까? :)

5

예측할 수없는 양의 메모리를 필요로하는 여러 Windows API에 감염되는 것과 같은 악의와 동일한 것으로 설명됩니다. 연습은 결과를 저장하지 않고 작업을 수행하는 버퍼가없는 상태에서 호출하고 결과가 저장되는 바이트 수를 계산하는 것입니다. 그런 다음 그 크기의 버퍼를 할당하고 버퍼를 가지고 함수를 다시 호출하여 크기를 알 수 있습니다.

이것은 분명히 악조건입니다. 그것은 부서진 관료제와 비슷한 컴퓨터 프로그래밍입니다. 각 부서에서는 이전 부서에 제공 한 것과 동일한 정보가 대부분있는 ​​양식을 작성해야하지만 각 양식에 대한 정보가 다르기 때문에, 당신은 다른 사람들에게 준 형태의 사본을 가져 가지 않을 것입니다. Ptui!

프로그래머 시간이 비싸고 CPU 시간이 쌉니다. 프로그래머가 동일한 API 호출을 N 번 작성하여 API가 자체적으로 해결할 수있는 일부 세계 상태를 제거하도록 요구하면이 문제를 해결할 수 있습니다.

가장 좋은 방법은 드라이버가 write()가 성공하는지 확인하기 위해 가능한 모든 작업을 수행하는 것입니다. 세계의 일부 상태를 검사하여 성공할 수 없다는 것을 미리 예측할 수 있다면 아마도 ioctl()이어야합니다.

+0

+1 하드웨어 해결 방법은 커널에 속하지만 ... 그렇지 않은 경우 매우 오래된 (유지되지 않은) 커널 인 경우 사용자 공간에서 해결 방법이 적당 할 수 있습니다. – bdonlan

+0

하지만이 경우에는 실제로 쓰고 싶지 않습니다. 따라서 창 유사도는 적용 할 수 없습니다. 나는 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 할 수 있습니다. 그렇지 않으면 기존 드라이버에 독점적 인 ioctl 호출을 추가하여 API를 변경하려고합니다. – Jamie

+3

나는 당신이 * 독점 호출을 드라이버에 추가해야한다고 생각하지 않는다. 나는 당신이 드라이버를 유지하는 사람에게이 행동을 지적해야한다고 생각하고,이 기능을 드러내거나 패치를 제공하라. I2C_PING 함수라고 부를 수 있습니다. ioctls()는이를 수행하는 한 가지 방법입니다./proc와 sysctl은 다른 것들이다. –

0

나는 ioctl()을 제안하지만 그 인터페이스에 대한 상태 정보를 얻기위한 더 나은 인터페이스가되지 않을까?

0

길이가 0 인 문자는 무엇을 의미합니까? 일반적으로 쓰기 란 데이터 전송을 의미합니다 ... 그리고 더 많은 문제는 드라이버를 확인하지 않고 대부분의 잘못된 입력을 잡아서 발생합니다.y

정보 비트가 1 인 경우 "do this"라고하면 나중에 ioctl을 사용하는 것이 좋습니다. 그것은 꽤 아니지만, 당신은 무엇을 할 수 있습니까?

핵 옵션을 사용하고 mmap()을 사용하여 모든 것을 사용자 공간으로 이동하십시오. 오버 헤드가 적고 "X를이 레지스터에 씁니다"와 같은 고전적인 코드를 작성하여 거의 필요한 것처럼 보입니다.

관련 문제