- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一个C初学者,尝试使用dup()
,我写了一个程序来测试这个函数,结果和我预期的有点不同。
代码:
// unistd.h, dup() test
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern void dup_test();
int main() {
dup_test();
}
// dup()test
void dup_test() {
// open a file
FILE *f = fopen("/tmp/a.txt", "w+");
int fd = fileno(f);
printf("original file descriptor:\t%d\n",fd);
// duplicate file descriptor of an opened file,
int fd_dup = dup(fd);
printf("duplicated file descriptor:\t%d\n",fd_dup);
FILE *f_dup = fdopen(fd_dup, "w+");
// write to file, use the duplicated file descriptor,
fputs("hello\n", f_dup);
fflush(f_dup);
// close duplicated file descriptor,
fclose(f_dup);
close(fd_dup);
// allocate memory
int maxSize = 1024; // 1 kb
char *buf = malloc(maxSize);
// move to beginning of file,
rewind(f);
// read from file, use the original file descriptor,
fgets(buf, maxSize, f);
printf("%s", buf);
// close original file descriptor,
fclose(f);
// free memory
free(buf);
}
程序尝试通过复制的 fd 写入,然后关闭复制的 fd,然后尝试通过原始 fd 读取。
我原以为当我关闭重复的fd时,io缓存会被自动刷新,但事实并非如此,如果我删除代码中的fflush()
函数,原来的fd不会能够读取已经关闭的复制fd写入的内容。
我的问题是:
这是否意味着关闭重复的fd时,它不会自动刷新?
@编辑:
对不起,我的错误,我找到了原因,在我最初的程序中有:
close(fd_dup);
但没有:
fclose(f_dup);
在使用 fclose(f_dup);
替换 close(f_dup);
后它起作用了。
因此,如果以正确的方式关闭,复制的 fd 会自动刷新,write()
和 close()
是一对,fwrite()
& fclose()
是一对,不能混用。
实际上,在代码中我可以直接使用复制的 fd_dup 和 write()
& close()
,不需要创建新的 文件
。
因此,代码可以简单地是:
// unistd.h, dup() test
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_SIZE 1024 // 1 kb
extern void dup_test();
int main() {
dup_test();
}
// dup()test
void dup_test() {
// open a file
FILE *f = fopen("/tmp/a.txt", "w+");
int fd = fileno(f);
printf("original file descriptor:\t%d\n",fd);
// duplicate file descriptor of an opened file,
int fd_dup = dup(fd);
printf("duplicated file descriptor:\t%d\n",fd_dup);
// write to file, use the duplicated file descriptor,
write(fd_dup, "hello\n", BUF_SIZE);
// close duplicated file descriptor,
close(fd_dup);
// allocate memory
char *buf = malloc(BUF_SIZE);
// move to beginning of file,
rewind(f);
// read from file, use the original file descriptor,
fgets(buf, BUF_SIZE, f);
printf("%s", buf);
// close original file descriptor,
fclose(f);
// free memory
free(buf);
}
最佳答案
来自 dup
手册页:
After a successful return from one of these system calls, the old and new file descriptors maybe used interchangeably. They refer to the same open file description (see open(2))and thus share file offset and file status flags; for example, if the file offset is modified by using lseek(2) on one of the descriptors, the offset is also changed for the other.
这意味着当您写入复制的文件描述符时,查找指针会发生变化,因此,在写入复制文件后从第一个文件描述符读取不应读取任何数据。
您正在使用 fdopen
创建重复流的分离 seek_ptr 和 end_ptr,这样,fd_dup
就不再是重复项。这就是为什么您可以在刷新和关闭流后读取数据的原因。
如果不刷新第二个文件描述符,我找不到任何关于为什么无法读取的有力事实。我可以补充一点,它可能与 sync
系统调用有关。
毕竟,如果你需要一个 IO 缓冲区,你可能使用了错误的机制,检查命名管道和其他缓冲 OS 机制。
关于c - dup() 和缓存刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26715246/
我有一个 excel 文件,我需要进行一些更改。我需要识别重复项,然后将“1st”放在第一个 dup 的系列列中。对于其余的重复需要在系列列中放置“其他重复”。可能吗?我尝试了查找和匹配,但没有任何帮
我是一个C初学者,尝试使用dup(),我写了一个程序来测试这个函数,结果和我预期的有点不同。 代码: // unistd.h, dup() test #include #include #incl
我正在尝试创建两个子进程: 一个子进程从文件中读取输入(该文件作为参数传入),并将输出写入管道。 另一个子进程从管道读取其输出并将其输出写入文件,该文件也作为参数传入。 父级为子级设置一些文件描述符,
当我们使用 dup 将 STDOUT 重定向到我们做的管道时: close(1); dup(fd[1]); close(fd[0]); close(fd[1]); execlp("ls","-al",
因此,我阅读了有关 Linux 中的文件 I/O 的内容,并想尝试一下。然而,我在代码中遇到了两个奇怪的行为,我正在努力寻找它们的原因。 /* * This program shows the us
我想知道为什么 dup 总是在下面的代码中返回零(其中一个文件被打开,而不是连续完成 10 个 dup): #include #include #include #include #inclu
我正在开发一个程序,要求用户输入 s、f 或 0 作为用户输入。 S 向系统打印预定义消息,f 将该预定义消息写入用户作为参数提供的文件。 0 终止程序。 我需要让程序只有一个写入标准输出的写入语句。
我正在在线学习算法类(class),我正在尝试计算数字列表中的最大成对乘积。这个问题之前已经回答过: maximum pairwise product fast solution和 Python fo
我想知道为什么以下字节码中的异常(用于抛出异常)是重复的。 NEW java/lang/IllegalArgumentException DUP INVOKESPECIAL java/lang/Ill
我正在编写代码以将 stdout 重定向到一个文件(例如 ls 返回到一个文件的结果)并且 dup2() 函数不重定向我的输出。这是我的代码: void testDup() { int new
close(fileno(stdout)); int fd = dup(fileno(stdin)); //printf("Hello World\n"); write(fd, "Hell
目前我只是在一个使用 java 字节码的项目中。我通常看到,当创建一个新的类实例并在其上调用一个方法时,字节码将是这样的: NEW DUP INVOKESPECIAL > 这里为什么要做“DUP”?
当涉及到复制文件描述符时,我能得到一个关于 dup() 函数的非常简单的解释吗?我想使用管道,但我还必须让 child 从管道中读取(这是简单的部分),但将数据写回父级。我应该使用另一根管道,还是可以
>> a = 5 => 5 >> b = "hello, world!" => "hello, world!" >> b.dup => "hello, world!" >> a.dup TypeErr
我对这个用于教育目的的小代码有疑问。我不明白它是如何工作的。 #include #include #define FNAME "info.txt" #define STDIN 0 int main
Java字节码指令集提供various forms of dup instruction 。我无法理解这些指令和 swap 指令的用途。哪些 Java 代码在编译时会使用这些指令生成字节码? 最佳答案
鉴于以下信息,我如何在唯一的 params 和 cron_action_id 对上选择最新的订单项(基于 time_entered)还没被处决吗? cron_schedule 例如,id 1、2和4具
int mypipe[2]; pipe(mypipe); int dupstdout=dup2(mypipe[1],1); cout<<"hello";//not printed on termina
我一直想创建一个 fork 两次以创建两个子进程的子进程。随着一个的输出,发送到另一个。我找到了这个示例代码。但我对它的工作原理感到困惑。 我找到了一个 example here .但我对 dup 的
所以我尝试使用 dup() 将标准输出重定向到一个文件。 int save_fd; save_fd=dup(1); //saves the current stdout close(1); //clo
我是一名优秀的程序员,十分优秀!