【问题标题】:how to accept pathname from stdin for open() system call?如何接受来自标准输入的路径名以进行 open() 系统调用?
【发布时间】:2019-02-17 00:31:48
【问题描述】:

当我从标准输入在 linux 上运行我的 C 脚本时,我需要接受路径名。

我已经尝试过:-

 int file = open(STDIN_FILENO, O_RDONLY)

“文件”总是分配给-1(文件未打开)。

我希望跑步

./myScript < test.txt 

通过“test.txt”打开

 open("test.txt", O_RDONLY); // expected after running the previous command

【问题讨论】:

  • STDIN_FILENO 已经是一个开放的描述符。 Shell 已为您调用 open 并将生成的文件描述符移动到 STDIN_FILENO,这是 0 的宏。
  • 那是不同的问题。我需要使用系统调用 open()
  • 从标准输入读入一个字符数组。使用 char 数组中的值作为打开的文件名。见fgets()
  • fgets() 也不是系统调用。我不能使用

标签: c linux linux-kernel system-calls


【解决方案1】:

我希望跑步

./myScript

通过“test.txt”打开

这是一个错误的期望。当您使用 shell 的重定向运算符 &lt; 时,它会打开文件 text.txt 并将文件描述符分配给程序的标准输入,即文件描述符 0 (STDIN_FILENO)。因此,无需再次打开文件——它已经完成了。

如果您希望您的程序接收文件名作为参数,那么不要使用 &lt; 并将其作为参数传递:

./myScript test.txt

现在您可以在程序的argv[1] 中接收文件名,并在调用open 系统调用时使用它。


注意:C 不是一种脚本,而是一种编译语言,因此您最好使用正确的术语(例如“C 程序”而不是“C 脚本”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2016-04-21
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多