关于C中的文件和I/O系统调用的基本问题(在Linux/UNIX上)



我正在努力提高我的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中的这些系统调用有任何好的参考,我们也将不胜感激。

为了简单起见,省略了错误检查:

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);

最新更新