【问题标题】:Basics questions regarding File and I/O System Calls in C (on Linux/UNIX)关于 C 中的文件和 I/O 系统调用的基础问题(在 Linux/UNIX 上)
【发布时间】:2014-09-08 20:51:41
【问题描述】:

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

open
create
close
unlink
read
write
lseek

由于没有更好的术语,这些手册页完全令人困惑和难以理解。例如,这里是 open 的手册页


"给定一个文件的路径名,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 中的这些系统调用有任何很好的参考,那也将不胜感激。

【问题讨论】:

  • 看看fprintf(),文件描述符是第一个参数。
  • fprintf 的第一个参数是 FILE* 而不是 文件描述符
  • 您自己的系统和环境的man 页面最好的参考。可能您将它们与基本教程混淆了(它们不是,也不打算成为)。
  • 所以如果我不理解手册页,那我可以从哪里开始呢?你提到的基本教程是什么? (不知道你是指一般的,还是指特定的)
  • 暂时忘记the lowest numbered。请记住,open() 和 creat() 返回一个非负整数值,可用于添加该特定文件以对该文件进行后续操作(read() ... write() ,...)。最后,您可以使用文件描述符来关闭()文件。

标签: c linux unix system-calls


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多