- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
希望大家指出我明显的错误;
系统是嵌入式linux,代码是c语言
我们在cgi脚本中有一些代码,它接受来自(Boa)网络服务器的STDIN_FILENO数据流(文件上传)并将其写入临时文件(“/tmp/file.txt”)。
下面的代码是一个非常简化的代码片段,但基本上显示了事物的顺序:
预期的文件是一个二进制文件,大约 20Mb,但写入总是在大约 1.4Mb 时失败,并出现 errno 9 (EBADF),这表明文件描述符已以某种方式关闭。
有足够的磁盘空间,并且 Web 服务器不会限制 POST 文件大小或截断数据。
代码:
char buffer[1024];
mode_t fd_mode=S_IRWXU;
if ((targ_fd = open("/tmp/file.txt", O_WRONLY | O_CREAT, fd_mode)) == -1)
{
OUTPUT("Error opening file\n");
return FAIL;
}
while(total < maxlen)
{
count = read(STDIN_FILENO, buffer, 1024);
if(count > 0)
{
if(write(targ_fd, buffer, count) < 0)
{
perror("Failed to write to file");
close(targ_fd);
return FAIL;
}
total += count;
}
else
{
return FAIL;
// Or success if EOF, code omitted for clarity
}
}
对于较小的文件(但大到足以需要多次写入),它可以完美地工作。
非常感谢任何想法!
编辑添加:更新代码,以及:
我们确实捕获了 read() 返回 0,但为了清楚起见我省略了它。程序是单线程的,在最初从第一个 read() 数据中修剪 MIME header 后,它只是将其读入缓冲区,然后将缓冲区写入临时文件,直到达到 maxlen 或输入结束。
附加说明:写入最初会成功,创建一个包含正确内容的文件,直到失败时的大小。
通过进一步测试进行更新:以下有用的评论/建议:
count 是一个 int,符号性没有问题。
我忘记检查 write() 的返回值,失败前的最后一个 write() 未能写入请求的全部字节数。更改 open() 以添加标志 O_SYNC 没有任何区别。
我添加了 fstat() 并在 open() 和失败时进行调试打印:
代码:
printf("File type: ");
switch (filestat.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: printf("regular file\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("unknown?\n"); break;
}
printf("I-node number: %ld\n", (long) filestat.st_ino);
printf("Mode: %lo (octal)\n",
(unsigned long) filestat.st_mode);
printf("Link count: %ld\n", (long) filestat.st_nlink);
printf("Ownership: UID=%ld GID=%ld\n",
(long) filestat.st_uid, (long) filestat.st_gid);
printf("Preferred I/O block size: %ld bytes\n",
(long) filestat.st_blksize);
printf("File size: %lld bytes\n",
(long long) filestat.st_size);
printf("Blocks allocated: %lld\n",
(long long) filestat.st_blocks);
printf("Last status change: %s", ctime(&filestat.st_ctime));
printf("Last file access: %s", ctime(&filestat.st_atime));
printf("Last file modification: %s", ctime(&filestat.st_mtime));
打开时的结果是:
Fd = 5
File type: regular file
I-node number: 486
Mode: 100600 (octal)
Link count: 1
Ownership: UID=0 GID=0
Preferred I/O block size: 4096 bytes
File size: 0 bytes
Blocks allocated: 0
Last status change: Thu Jan 1 00:00:51 1970
Last file access: Thu Jan 1 00:00:51 1970
Last file modification: Thu Jan 1 00:00:51 1970
错误结果:
Fd = 5
Failed to write to the pipe (errno = 9), managed 273 / 4096 bytes
File type: regular file
I-node number: 486
Mode: 100600 (octal)
Link count: 1
Ownership: UID=0 GID=0
Preferred I/O block size: 4096 bytes
File size: 1499136 bytes
Blocks allocated: 2944
Last status change: Thu Jan 1 00:00:51 1970
Last file access: Thu Jan 1 00:00:51 1970
Last file modification: Thu Jan 1 00:00:51 1970
是的,系统时钟未设置。
更多信息:失败后:
root@IPNC:~# df -i /tmp
Filesystem Inodes Used Available Use% Mounted on
none 5664 7 5657 0% /tmp
root@IPNC:~# df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
none 25600 1508 24092 6% /tmp
根据要求提供更多信息:
正在进行的 MIME 修剪只是跳过第一个到达的数据,直到数据之前的“\r\n\r\n”,因此第一次写入开始从缓冲区的中途读取。我已经检查过,这是从正确的点开始并在正确的点结束,并且使用较小的测试文件(~50k),整个文件都被正确接收和写入,没有错误、重载或欠载。
进一步测试的结果:
嗯,还没解决。故障点随着不同的输入数据(文件大小和类型)而移动,但似乎不会绊倒任何特定的模式或数据(例如:一个文件在一大块 0xFF 的中间发生故障)。
我尝试过使用 fcntl() 来锁定 fd,使用 dup() 并处理新的 fd,以防另一个 fd 以某种方式从外部关闭,两者都没有任何区别。
我将尝试插入虚拟数据,看看是否可以成功写入 filesize 字节的虚拟数据。
**终于接近尾声了...**
看起来 Boa 以一种奇怪的方式处理 HTTP POST 请求,将它们写入临时文件,并将其复制到 objective-c GI 脚本的 STDIN。如果/tmp 中有足够的空间容纳两个副本,那就没问题,但没有(我们是嵌入的)。仍然存在一些奇怪的地方:它创建的文件永远不会出现在文件列表中,并且写入失败并不表示“空间不足”。肯定会发生一些奇怪的事情,但现在我认为这并不完全是 write() 的失败,而是父代码中的一些更大的问题。
最佳答案
好吧,我想我应该关闭这个......
答案有点复杂。
最初我说“我们有足够的磁盘空间”,我们确实这么做了,直到 Boa 决定将整个 POST 数据(约 20Mb)缓冲在/tmp 文件夹中(总可用空间约 25Mb),这使得写入将数据文件写入/tmp 非常棘手,并解释了为什么 write() 文件越小(大约 25Mb 减去文件大小)就越失败,大概如果文件是 12.5Mb,它就会成功。
无论如何,奇怪的返回代码(EBADF)而不是任何类型的空间不足指示使鹅追逐变得更加疯狂。
令人失望的结果是我们必须制定其他方案将文件直接上传到设备,无论是通过其他方式(tftp、wget)还是使用上传页面中的脚本来拆分文件分成 block 并一次上传一个 block 。
关于c - 尽管多次成功写入,但 Write() 仍导致 EBADF 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25722339/
所以我正在阅读一本过时的小书(2010 年),我正在尝试使用 Linux 系统调用复制一个文件。这就是我所拥有的: 注意:忽略tlpi_hdr.h和error_functions.h,它们定义了err
无法清除输出流:java.net.SocketException:关闭失败:EBADF(错误文件编号) 有没有人得到这个,有没有解决这个异常的方法? 最佳答案 这可能意味着您没有写入该文件的权限或者它
我的程序有问题,它正在使用 IPC 消息队列。虽然 IPC 工作正常,但管道存在问题,我还无法解决。这是我程序的子进程代码。它从文件中读取一个字节,然后将其写入管道。 char buf; int
我遇到了以下问题:我有一个接收连接的 epoll 代码: while (1) { int nfds = epoll_wait(epollfd, events, 4096, -1); i
如果我像 50 reload/10 seconds 这样多次重新加载我的应用程序(从带有重新加载按钮的浏览器),它会给我这个错误: events.js:45 throw arguments[1
我已经搜索过相关问题,但没有找到。我创建了一个显示图片、名称和地址的 InfoWindowMarker。然后我创建 OnInfoWindowClickListener,它将显示所选标记的纬度和经度。但
我正在开发一个在两个进程之间进行IPC调用的程序。我使用socketpair创建两个套接字fd: int fds[2] = {-1,-1}; if (socketpair(AF_LOCAL, SOCK
我正在尝试修复调用 select() 的事件循环中的错误。当 select() 返回 EBADF 时,会记录一个错误,然后重新初始化 fd 集并再次调用 select。这会导致日志记录的无限硬循环,在
我们的生产代码中存在一个长期存在的错误。这本质上是一个基于套接字的守护进程。它使用 select 监听一堆文件描述符。 偶尔(大约一天一次),select 将返回 EBADF。 我已经编写了代码来搜索
我的 VS 代码在使用 git 时开始变得 super 慢,而且我经常在使用 EBADF 时看到错误,无论是在搜索文件还是使用 git 时。 我看到磁盘可能不可用。我有 Mac Pro 2020。这是
由于 CVE 导致我们将应用程序升级到 Rails 4.1.12 和 Rack 1.5.5,我们似乎随机出现 502。大约 1% 的请求,我不能始终如一地重新创建问题,只能观察它(这非常令人沮丧,你可
我尝试使用 Node.js 处理一个 500MB 的 Apache 日志文件,将其语法从 ip.ip.ip.ip - - [02/Aug/2012:05:01:17 -0600] "GET /path
我有一个代码,我在其中使用 select() 函数调用来轮询添加到 readfds 集的套接字列表,用于任何传入数据。 while(1) { ret = select(n,&readfds,N
当我尝试将外部存储的一个文件复制到文件夹数据库时,会发生此错误: java.io.IOException: read failed: EBADF (Bad file number) 这个错误发生在这个
我是 Hadoop 的新手,尝试使用 Hadoop 编写关系连接。该算法尝试在连续两轮中连接三个关系。我使用递归方法。该程序运行良好。但是在执行期间它会尝试打印这样的警告: 14/12/02 10:4
我有这个错误 java.io.IOException: read failed: EBADF (Bad file number) 在这行代码中: while ((input = fis.read(b
希望大家指出我明显的错误; 系统是嵌入式linux,代码是c语言 我们在cgi脚本中有一些代码,它接受来自(Boa)网络服务器的STDIN_FILENO数据流(文件上传)并将其写入临时文件(“/tmp
尝试写入 RandomAccessFile 时,我收到 java.io.IOException: write failed: EBADF(错误文件描述符)。 RandomAccessFile
程序运行到getsockname,返回-1,errno为9(EBADF,错误的文件描述符)。但是,Android 应用程序中检测的代码运行良好。 void sysLibCSendHookHandler
我对制作简单的 .xls 文件并将数据写入一个单元格的脚本有疑问。这是简单的代码: require 'spreadsheet' class Filter def filter @excel
我是一名优秀的程序员,十分优秀!