【问题标题】:Special handling of /dev/null in open and write?/dev/null 在 open 和 write 中的特殊处理?
【发布时间】:2011-02-17 13:35:36
【问题描述】:

根据another thread 的提示,我想分析指针,它们的解除引用是否会导致分段错误。这个想法是编写这样的代码:

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 时,它会像预期的那样工作:将NULL 指针传递给write(..),它会返回-1

"/dev/null"这种特殊待遇的原因是什么?

谢谢,

查理

【问题讨论】:

    标签: linux gcc g++ dev-null


    【解决方案1】:

    因为是特殊文件,所以自带readwrite的定义。 (linux内核使用驱动层中的函数指针来实现多态性)。显然/dev/null设备提供的write版本没有使用你传入的指针。

    【讨论】:

    • 嗯......但这很糟糕。如何在不创建临时文件的情况下解决此问题?
    • 既然你想知道取消引用指针是否会导致段错误,为什么不取消引用它并在发生段错误时处理?不需要文件。
    • 我更喜欢提前检查指针 - 因为它简单易懂。
    • @Charly:你认为write(到普通文件)如何返回EFAULT?它捕获了段错误。
    • @BenVoigt:是的,我刚刚编写了一个演示应用程序,它正在运行。我不确定它是否是EFAULT - 但strerror() 返回了一些类似的文字......
    猜你喜欢
    • 2018-01-29
    • 2014-03-27
    • 1970-01-01
    • 2017-08-09
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多