Специальная обработка / dev / null в open и write? - PullRequest
2 голосов
/ 17 февраля 2011

согласно подсказке от другого потока Я хочу проанализировать указатели, если их разыменование вызовет ошибки сегментации или нет.Идея состоит в том, чтобы написать код, подобный следующему:

bool IsPointerValid( void* pPointer )
{
    // when opening "/tmp/hugo" here, it works fine... but not with /dev/null??
    int iFD = open( "/dev/null", O_WRONLY );
    int iBytesWritten = write( iFD, pPointer, 4 );
    close( iFD );

    return iBytesWritten > 0;
}

Но что бы я ни передал IsPointerValid(..), он всегда возвращает true - потому что iBytesWritten всегда 4.Но при открытии "/tmp/testfile" или fifo он работает как ожидалось: передавая нулевой указатель на write(..), он возвращает -1.

В чем причина такой специальной обработки "/dev/null"?

Спасибо,

Чарли

1 Ответ

5 голосов
/ 17 февраля 2011

Поскольку это специальный файл, он содержит собственное определение read и write.(Ядро linux реализует полиморфизм, используя указатели функций на уровне драйверов).Очевидно, версия write, предоставляемая устройством /dev/null, не использует указатель, который вы передаете.

...