我试图在我的代码中阻止linux中的write()函数。我们可以做什么来阻止write()函数,使其被阻止并返回-1?我试图失败的write()函数,击中一个错误来检查代码,我写的。我应该阻止或取消阻止I/O以使linux中的write()函数失败吗?write()函数处理文件描述符。
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
polkgigr2#
如果你想让write()失败,你可以写一个特殊的文件/dev/full,它模拟“设备上没有剩余空间”:
/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)
vyswwuz23#
因为你想在你控制的代码中检查write的返回值,你可以调用不同的函数,例如。testWrite,它调用write或在您决定这样做时返回-1:
testWrite
int testWrite(...) { // return write(...); return -1; }
或
int testWrite(...) { if(projectIsInTestMode) { return -1; } else { return write(...); } }
6rqinv9w4#
我偶尔会通过运行一个程序来诱发写入错误,该程序的输出将进入一个文件,而该文件恰好位于外部USB“拇指驱动器”上,然后在程序运行时故意拔掉驱动器。(操作系统可能会发出通常的严厉警告,指出磁盘卸载不当,但有时我们不得不以科学的名义做出这些牺牲。)另一种可能性是写入网络安装在另一台计算机上的文件,并在程序运行时断开网线(或关闭WiFi等)。这往往会导致非常难以处理的错误(特别是当事情容易挂起时,而不是错误)。另一种可能性是在一个快满的磁盘上运行程序,或者在程序运行时故意(从另一个窗口)填满磁盘。
4条答案
按热度按时间fdbelqdn1#
我们可以做什么来阻止write()函数,使其被阻止并返回-1?
选项:
write()
函数,返回-1
。一点小知识:glibc和musl为大多数C库函数导出 weak 符号,您的代码将首先链接到C标准库。这一切都使得链接器更喜欢您提供的函数,而不是C标准库实现。
-Wl,--wrap=write
,并提供__wrap_write
实现。ptrace
程序并修改write
的返回值polkgigr2#
如果你想让
write()
失败,你可以写一个特殊的文件/dev/full
,它模拟“设备上没有剩余空间”:运行:
vyswwuz23#
因为你想在你控制的代码中检查
write
的返回值,你可以调用不同的函数,例如。testWrite
,它调用write
或在您决定这样做时返回-1
:或
6rqinv9w4#
我偶尔会通过运行一个程序来诱发写入错误,该程序的输出将进入一个文件,而该文件恰好位于外部USB“拇指驱动器”上,然后在程序运行时故意拔掉驱动器。(操作系统可能会发出通常的严厉警告,指出磁盘卸载不当,但有时我们不得不以科学的名义做出这些牺牲。)
另一种可能性是写入网络安装在另一台计算机上的文件,并在程序运行时断开网线(或关闭WiFi等)。这往往会导致非常难以处理的错误(特别是当事情容易挂起时,而不是错误)。
另一种可能性是在一个快满的磁盘上运行程序,或者在程序运行时故意(从另一个窗口)填满磁盘。