如何创建程序然后写入文件

时间:2012-09-16 19:36:45

标签: c# c file-io

我正在分析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位于THIS链接。

所以我的问题是我想知道程序是如何写入文件的。例如,在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,我很难理解它基本上做了什么。

2 个答案:

答案 0 :(得分:2)

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

这会创建并打开文件,打开文件以便在文件末尾的每次写入时附加更多文件。

dup2(fd, STDOUT_FILENO);

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

r_close(fd) ;

这将关闭从open获得的描述符,使副本保持原样。

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

这会写入程序的标准输出流,现在与打开新文件时的打开文件描述相同。

答案 1 :(得分:1)

  

dup2()函数复制打开的文件描述符。特别,   它提供了由服务提供的服务的备用接口   fcntl()函数使用F_DUPFD常量命令值,用   fildes2的第三个论点。重复的文件描述符共享   任何锁与原件。

电话:

fid = dup2(fildes, fildes2);

相当于:

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

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

Re:问题的第二部分,有什么区别?

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

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

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

最后我会冒险猜测;

  

我正在分析Linux中的C程序写入文件的方式和我   总结一下:

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