[英]How is program creating then writing to file
我正在分析Linux中C程序写入文件的方式,并将其总结为:
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include "restart.h"
#define CREATE_FLAGS (O_WRONLY | O_CREAT | O_APPEND)
#define CREATE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main(void) {
int fd;
fd = open("my.file", CREATE_FLAGS, CREATE_MODE);
dup2(fd, STDOUT_FILENO);
r_close(fd) ;
write(STDOUT_FILENO, "Hello World", 11) ;
return 0;
}
两个小头文件r_close.c和restart.h在此链接中。
所以我的问题是我想知道程序是如何写入文件的。 例如,在c#中这样做的区别是:
static void Main(string[] args)
{
var file = System.IO.File.OpenWrite("my.file");
file.Write(System.Text.Encoding.ASCII.GetBytes("Hello World"), 0, 11);
file.Close();
}
我在许多链接(例如http://www.mkssoftware.com/docs/man3/dup2.3.asp)中都对dup2方法进行了介绍,但我很难理解它的基本功能。
fd = open("my.file", CREATE_FLAGS, CREATE_MODE);
这将创建并打开文件,并在文件末尾的每次写入操作中追加附加内容来打开文件进行写入。
dup2(fd, STDOUT_FILENO);
这会将新打开的文件的文件描述符复制到该程序的标准输出描述符即描述符的顶部。 现在,这两个描述符引用了相同的打开文件描述。
r_close(fd) ;
这将关闭从open
获得的描述符,而副本保持不变。
write(STDOUT_FILENO, "Hello World", 11) ;
这将写入程序的标准输出流,该输出流现在与我们从打开新文件获得的打开文件描述相同。
dup2()函数复制一个打开的文件描述符。 具体来说,它使用F_DUPFD常量命令值(使用fildes2作为其第三个参数)为fcntl()函数提供的服务提供了备用接口。 复制的文件描述符与原始文件共享任何锁。
电话:
fid = dup2(fildes, fildes2);
等效于:
close(fildes2);
fid = fcntl(fildes, F_DUPFD, fildes2);
这意味着我们已经修改了操作系统必须保留打开文件描述符的表。 它使用fcntl()
函数。 fcntl()提供对打开文件描述符的控制。 基本上,它将int复制到int。 但是它使用系统调用来完成。 因为它修改了OS资源。 您对系统的一句话:您知道FileTable中的索引吗? 是? 并将FilePointer复制到另一个索引。 (还有其他一些事情,但是我现在必须忽略它。)
回复:问题的第二部分,有什么区别?
他们基本上做同样的事情。 可能完全相同的字符被写入文件。 它确实做一件事。 就是dup2()
STDOUT_FILENO
。 到一个文件。 这改变了标准输出。 如果我没记错的话,该代码会将通常会进入控制台的所有输出重定向到fd
,在您的情况下为"my.file"
。 这就是您列出的C#和C之间的主要区别。
还应注意,如果您只关心将“ Hello World”写入文件,则此示例中的整个dup2()
毫无意义。 这有点像int x = 5; int y = x; Console.WriteLine(y);
int x = 5; int y = x; Console.WriteLine(y);
。 在您的示例中,多余的步骤没有任何作用。
另一个更一般的区别是C#对您的程序员隐藏了许多低级内容。 使用C进行编码时,您将能够更轻松地执行较低级别的文件和系统操作。 缺点是您必须对低层内容进行更多编码。 虽然大多数情况下,您实际上并不十分在乎这些东西是如何发生的,但是确实确实会发生。 通常,用C#编写代码会更快,因为所有低级的东西都已经为您很好地处理了。 -可以帮助您理解主题的主题
最后,我会冒险猜测。
我正在分析Linux中C程序写入文件的方式,并将其总结为:
您正在分析的是一个处理I / O操作的程序,而不是普通的写入文件的程序。 那将解释dup2()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.