有关C中的文件和I / O系统调用的基础知识问题(在Linux / UNIX上)

时间:2014-09-08 20:51:42

标签: c linux unix system-calls

我正致力于提高我的C编程知识,但我无法理解以下Unix系统调用的手册页:

open
create
close
unlink
read
write
lseek

由于缺乏更好的术语,每个人的手册都完全令人困惑和难以理解。例如,以下是打开的手册页


"给定文件的路径名,open()返回一个文件描述符,一个小的非负整数,用于后续系统调用(read(2),write(2),lseek(2),fcntl (2)等)。成功调用返回的文件描述符将是当前未为进程打开的编号最小的文件描述符。 默认情况下,新文件描述符设置为在execve(2)上保持打开(即,最初禁用fcntl(2)中描述的FD_CLOEXEC文件描述符标志;下面描述的O_CLOEXEC标志可用于更改此默认值)。文件偏移量设置为文件的开头(请参阅lseek(2))。

对open()的调用会创建一个新的打开文件描述,这是系统范围的打开文件表中的一个条目。此条目记录文件偏移量和文件状态标志(可通过fcntl(2)F_SETFL操作修改)。文件描述符是对这些条目之一的引用;如果随后删除或修改路径名以引用其他文件,则此引用不受影响。新的打开文件描述最初不与任何其他进程共享,但可以通过fork(2)进行共享。"


我不知道这一切意味着什么。根据我的理解,如果open返回一个负整数,则发生错误,如果它返回一个正整数,那么该整数可用于进一步的系统调用(???)。也就是说,遗憾的是,基本上我的知识范围以及我可以尝试从手册页解析的内容。我需要一些帮助。

它"返回当前未为进程打开的编号最小的文件描述符是什么意思"?它指的是什么过程?为什么它是编号最小的文件描述符,为什么这很重要/我将如何使用它?我讨厌听起来像个白痴,但老实说,我不知道它在说什么。

让我们举个例子。让我们说我想在目录中创建一个新文件,并从另一个目录中打开一个文件,并将我打开的文件复制到我创建的文件中,同时检查错误。这是我的尝试:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
  int XYZ = creat("XYZ.doc", 0 );
  if (XYZ < 0)
    printf("file creating error");
  int file = open("/usr/.../xx.xx", 0);
  if(file < 0)
    printf("file opening error");
}

如何将我打开的文件复制到我创建的文件中?这应该很容易。但是如果我想将我打开的文件反向复制到我创建的文件中呢? (也许这个例子将说明如何使用手册页中提到的文件偏移量,我目前不了解......)

我想编辑这篇文章,在每个系统调用旁边写一个外行人的术语描述,从而为人们学习提供良好的在线资源。此外,如果任何人对C中的这些系统调用有任何良好的引用,那么也将非常感激。

1 个答案:

答案 0 :(得分:3)

为简单起见,错误检查遗漏:

char data[1024];     /* size of this chosen more or less on a whim */
ssize_t n;

while ((n = read(file, data, sizeof(data))) > 0) {
    write(XYZ, data, n);
}
close(file);
close(XYZ);