0

我正在分析 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();
    }

我在许多链接中查看了 dup2 方法的描述,例如http://www.mkssoftware.com/docs/man3/dup2.3.asp ,我很难理解它的基本功能。

4

2 回答 2

2
fd = open("my.file", CREATE_FLAGS, CREATE_MODE);

这将创建并打开文件,将其打开以追加写入,每次写入都发生在文件末尾。

dup2(fd, STDOUT_FILENO);

这会将新打开文件的文件描述符复制到作为程序标准输出描述符的描述符之上。这两个描述符现在引用相同的打开文件描述。

r_close(fd) ;

这将关闭从 获得的描述符open,保持副本完好无损。

write(STDOUT_FILENO, "Hello World", 11) ;

这将写入程序的标准输出流,这与我们打开新文件时得到的打开文件描述相同。

于 2012-09-16T19:41:08.830 回答
1

dup2() 函数复制打开的文件描述符。具体来说,它使用 F_DUPFD 常量命令值为 fcntl() 函数提供的服务提供了一个替代接口,其中 fildes2 作为其第三个参数。复制的文件描述符与原始文件描述符共享任何锁。

来电:

fid = dup2(fildes, fildes2);

相当于:

close(fildes2);
fid = fcntl(fildes, F_DUPFD, fildes2);

这意味着我们已经修改了操作系统必须保存打开文件描述符的表。它使用该fcntl()功能。fcntl() 提供对打开文件描述符的控制。基本上它将一个int复制到一个int。它使用系统调用来实现;因为它修改了操作系统资源。你对系统说:你知道FileTable中的那个Index吗?是的?将 FilePointer 复制到另一个索引。(还有其他一些事情,但我现在不得不忽略它。)

回复:你问题的第二部分,有什么区别?

他们基本上做同样的事情。可能完全相同的字符被写入文件。它确实做了一件额外的事情。就是这样dup2() STDOUT_FILENO。到一个文件。这改变了标准输出的内容。如果我没记错的话fd,在您的情况下,该代码会将通常会转到控制台的所有输出重定向到"my.file". 这是您列出的C#C之间的主要区别。

还应该注意的dup2()是,如果您所关心的只是将“Hello World”写入文件,那么这个示例中的整体是毫无意义的。这有点像去int x = 5; int y = x; Console.WriteLine(y);。额外的步骤在您的示例中没有任何作用。

另一个更普遍的区别是,C# 对程序员隐藏了很多低级的东西。在使用 C 编码时,您将能够更轻松地进行较低级别的文件和系统操作。缺点是您必须对较低级别的内容进行更多编码。虽然大多数情况下你并不真正关心这些事情是如何发生的,而是它确实发生了。通常,在 C# 中编写代码会更快,因为所有低级别的东西都已经为您很好地处理了。-- 分类主题点,可以帮助你理解

最后我冒险猜测一下;

我正在分析 Linux 中的 C 程序写入文件的方式,并将其总结为:

您正在分析一个处理 I/O 操作的程序,而不是普通的文件写入。这将解释dup2().

于 2012-09-16T20:49:55.493 回答