C语言 如何在linux中阻止write函数?

ut6juiuv  于 2023-06-05  发布在  Linux
关注(0)|答案(4)|浏览(159)

我试图在我的代码中阻止linux中的write()函数。我们可以做什么来阻止write()函数,使其被阻止并返回-1?
我试图失败的write()函数,击中一个错误来检查代码,我写的。
我应该阻止或取消阻止I/O以使linux中的write()函数失败吗?write()函数处理文件描述符。

fdbelqdn

fdbelqdn1#

我们可以做什么来阻止write()函数,使其被阻止并返回-1?
选项:

  • 只需编写自己的write()函数,返回-1
ssize_t write(int fd, const void *buf, size_t s) { return -1; }

一点小知识:glibc和musl为大多数C库函数导出 weak 符号,您的代码将首先链接到C标准库。这一切都使得链接器更喜欢您提供的函数,而不是C标准库实现。

  • 链接时使用-Wl,--wrap=write,并提供__wrap_write实现。
  • ptrace程序并修改write的返回值
polkgigr

polkgigr2#

如果你想让write()失败,你可以写一个特殊的文件/dev/full,它模拟“设备上没有剩余空间”:

// write.c

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(void)
{
    static const char data[] = "Hello World!\n";

    ssize_t ret = write(STDOUT_FILENO, data, sizeof(data));

    int err = errno;

    fprintf(stderr, "write() returned %zi\n", ret);

    if (ret == -1) {
        fprintf(stderr, "errno: %i (%s)\n", err, strerror(err));
    }

    return 0;
}

运行:

$ ./write > /dev/full 
write() returned -1
errno: 28 (No space left on device)
vyswwuz2

vyswwuz23#

因为你想在你控制的代码中检查write的返回值,你可以调用不同的函数,例如。testWrite,它调用write或在您决定这样做时返回-1

int testWrite(...) {
   // return write(...);
   return -1;
}

int testWrite(...) {
   if(projectIsInTestMode) {
      return -1;
   } else {
      return write(...);
   }
}
6rqinv9w

6rqinv9w4#

我偶尔会通过运行一个程序来诱发写入错误,该程序的输出将进入一个文件,而该文件恰好位于外部USB“拇指驱动器”上,然后在程序运行时故意拔掉驱动器。(操作系统可能会发出通常的严厉警告,指出磁盘卸载不当,但有时我们不得不以科学的名义做出这些牺牲。)
另一种可能性是写入网络安装在另一台计算机上的文件,并在程序运行时断开网线(或关闭WiFi等)。这往往会导致非常难以处理的错误(特别是当事情容易挂起时,而不是错误)。
另一种可能性是在一个快满的磁盘上运行程序,或者在程序运行时故意(从另一个窗口)填满磁盘。

相关问题