2010-04-25 2 views
3

비트 버켓 포인터가있는 방법이 있습니까?비트 버킷 포인터가있는 방법이 있습니까? (C/C++)

많은 IO (특정 입력 관련) 시스템 호출은 특정 크기의 버퍼로 데이터를 반환합니다. 거기에 트릭이나 sorta 비트 양동이 포인터를 만드는 방법, 그래서 내가 던져 질 데이터의 양을 받아 들일 수 있습니다. "char tmp [INT_MAX]"와 같은 일을하는 것은 미친 짓입니다. 내가 찾고있는 행동은 포인터 세계에서만/dev/null과 같은 것이다.

이것에 대해 희망을 갖지 말자 .... 단지 호기심.

감사합니다, Chenz

UPDATE : 아마도 mmap에-ING을/dev/null. 내가 그 질문에 대해 잊어 버렸습니다.

+0

?. API는 일반적으로 함수가 기록 할 RAM의 주소를 나타내는 32 비트 또는 64 비트 값을 받아들이도록 정의됩니다 .OS 기능은 이미 컴파일되어 있고 쓰기가 가능합니다. 두 가지 가능한 옵션이 있습니다 : 쓰기 작동 (비트 버킷이 아님) 또는 실패 (페이지 오류, 값 비싼 것) –

+0

그 진술이 정말 '때로 믿을 당신은 호출하는 시스템 기능을, 무엇을 의미하는지 생각해 – MSalters

답변

2

어떤 IO 인터페이스를 사용하고 있습니까? FILE 기반의 메소드 (fopen, fread 등)라면, 같은 버퍼에 계속 읽어 들여 그 내용을 무시할 수 있습니다. C/C++에서 무엇이든 할 수 있으므로 원하는 것을 확실히 할 수는 있지만 실제로 무엇을하려고하는지 명확하게 알 수는 없습니다. 어쩌면 코드를 게시할까요?

+0

사실, C 또는 C++에서는 아무 것도 할 수 없습니다. 특히 하드웨어를 다시 배선 할 수는 없으며 이는 유효 메모리를 겹치지 않는 무한히 긴 버퍼를 만드는 데 필요합니다. –

1

더미 데이터를 읽을 수있는 스택의 임시 배열을 상상해보십시오. 정교한 방법을 시도하면 CPU 캐시가 무효화되고 성능이 떨어집니다.

1

파일 인 경우 데이터를 건너 뛸 수 있습니다. mmaping/dev/null 메모리 영역이 기록 될 때 메모리를 할당하고 소비합니다. 어쨌든, 당신이하려는 것을 정말로 분명하지 않습니다.

0

많은 IO (특정 입력 관련) 시스템 호출은 특정 크기의 버퍼로 데이터를 반환합니다.

일반적으로 크기는 작거나 사용자가 지정합니다.

미리 정의 된 작은 크기 인 경우 스택에 버퍼를 할당하고 결과를 무시하십시오.

크기를 지정하면 크기 지정이 0이면 버퍼가 무시됩니다. 그렇다면 그것을하십시오. 그렇지 않은 경우 작은 버퍼를 할당하고 필요한 경우 반복적으로 함수를 호출하여 원하지 않는 모든 데이터를 플러시합니다.

아마도 함수 작성자를 작성하고 NULL 버퍼 포인터를 허용하는 것이 좋습니다.

0

할당 된 단일 페이지를 일련의 가상 주소에 mmap 할 수 있습니다. 그러나 포인터를 충분히 증가 시키면 결국 끝이 떨어질 것입니다. 그 주위를 돌아 다니는 일은 없으며, 당신이 제공하는 포인터는 충분히 증가한다면 중요한 것을 가리킬 것입니다.

호출하는 API가 포인터 대신 반복기를 허용하는 경우 모양이 좋아집니다. 반복기에 no-op를 증가시킬 수 있기 때문입니다.

0

어쩌면 당신이 가고 싶은 곳을 찾을 수 있습니다.

0

필자가 생각해 낸 유일한 방법은 프로그램의 가상 메모리를 다른 가상 프로그램의 가상 메모리 공간으로 전환하는 일종의 시스템 호출을 작성하는 것입니다. 그러나 가짜 메모리 공간은 쓰기 전용이며 저장되지 않습니다. 그런 다음 "NULL 포인터"를 쓰면 가상 메모리 공간을 다시 바꿀 수 있습니다."

예 :

main() 
    { 
    int fd = open("file", O_RDONLY); 
    null_vm(); 
    read(fd, NULL, UINT_MAX); 
    unnull_vm(); 
    close(fd); 
    return; 
    } 

감사합니다, Chenz

이 기술을 구현하여 해결하고자하는 어떤 문제