【问题标题】:Wildcard not expanded in recursive cp using execvp()使用 execvp() 在递归 cp 中未扩展通配符
【发布时间】:2017-12-07 20:12:47
【问题描述】:

虽然路径 "/home/abhijit/Documents/LINUX/editor/" 下有多个文件,但我没有在 "temp" 文件夹中获得所需的输出(应该从编辑器文件夹中复制所有文件),而是输出即将到来错误为:“cp: cannot stat '/home/abhijit/Documents/LINUX/editor/*': No such file or directory”

#include <stdio.h>
#include <unistd.h>

int main( void )
{
    char* argv1[10] = { "cp", "-rf", "/home/abhijit/Documents/LINUX/editor/*", "/home/abhijit/Documents/LINUX/temp", 0 };
    execvp( argv1[0], argv1 );
}

但如果我说如下,它工作正常。

 char* argv1[MAX_ARGS] = { "cp", "-rf", "/home/abhijit/Documents/LINUX/editor/", "/home/abhijit/Documents/LINUX/temp", 0 };

【问题讨论】:

  • 如果你需要 shell-globbing,你可以使用 system() 代替
  • @BhargavRao - 我试图投票取消删除 Abhijit 的回答,但由于您的身份,我不能。请原谅我对您的决定提出质疑,但我认为 Abhijit 的回答应该成立。它提供了完整的代码,并且归功于 SomeProgrammerDude 的回答。我认为它比 SomeProgrammerDude 的答案更好,因为 SPD 的答案缺少代码。
  • 我坚信 stack-overflow 会尽可能提供完整的信息。 BhargavRao - 我完全同意你的看法。我提供的代码是“execvp() 和 glob() 的简单用法”来解决问题,并且答案的完整归功于 SomeProgrammerDude 的输入。根据 SomeProgrammerDude 的观点 fork 和 exec 应该被使用,我并不否认。顺便说一句,我已经发表了评论。根据我的意见,我提供的代码“不应该被删除”,因为它传达了实现输出的基本功能。如果我错了,请纠正我。

标签: c linux fork ipc execvp


【解决方案1】:

星号模式*shell 而非cp 命令本身扩展。

如果您通过 shell 运行 cp 命令,可以通过 exec 调用带有 -c 选项的 shell 或使用 system 函数而不是 exec 来使其工作。

【讨论】:

  • 感谢您的快速回复。是的,通过外壳它可以正常工作。但是,对不起,我使用的是没有 shell 的busybox。但是在execvp()系统调用本身如何实现呢?有没有可能实现呢?
  • @AbhijitSahu 如果你想使用globbing 通配符,你要么必须使用shell,要么使用glob 函数和多个cp 命令(每个匹配一个)。跨度>
  • 非常感谢您的投入 - “一些程序员老兄”。我已经更新了答案评论中的代码。再次感谢您的帮助。
  • @AbhijitSahu 你知道exec 的功能做什么吗?他们用你尝试exec 的程序替换你的程序? exec 函数仅在错误时返回。也许您还应该了解forkthe fork-exec idiom
  • 是的,我非常了解。感谢您的澄清!实际上我在我的代码库中使用 fork() , sigchld_hdl 处理程序和 execvp() 。我没有在这里用整个长编编写 fork(),而是用简单的 execvp() 示例提出了问题 - 只是为了传达这个狂野的字符问题。谢谢。
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多