【发布时间】:2018-01-13 09:14:29
【问题描述】:
我被分配用 C++ 编写一个小型 shell 程序。它应该采用与常规 bash shell 相同的命令(例如:mv、cmp 等),然后使用 fork() 和 exec() 调用 bash 版本的函数。
我尝试了很多方法来调用函数,但我一直遇到这个问题:当文件与可执行文件位于同一目录时它可以工作(例如:“tail test.txt”),但是当该文件位于它不存在的不同目录中(例如:“tail ~/Documents/test.txt”),它告诉我该文件不存在。确切的措辞是:
tail:无法打开“~/Documents/test.txt”进行阅读:没有这样的文件或 目录
但该文件确实存在,并且相同的命令在常规 bash shell 中有效。
现在我真的迷失了,它应该适用于任何目录中的文件,我无法弄清楚我在这里做错了什么。
这是相关代码(所有命令几乎相同):
pid_t pid = fork();
if(pid > 0)
{
wait(NULL);
}
else if(pid == 0)
{
execl("/bin/mv","mv", arg1.c_str(), arg2.c_str(), NULL);
exit(1);
}
我尝试使用不同版本的 exec,但我遇到了需要 char *const[] 作为参数的命令的问题,因为文件路径是一个变量,它不会接受它。
char *const args[] = {"/usr/bin/tail", arg1.c_str(), "-n 5", NULL}; // error here
pid_t pid = fork();
if(pid > 0)
{
wait(NULL);
}
else if(pid == 0)
{
execv("/usr/bin/tail", args);
exit(1);
}
我(未成功)尝试过的其他版本是:
char *env[] = {"PATH=~/"};
execle("/usr/bin/tail", "tail", arg1.c_str(), "-n 5", NULL, env);
execlp("/usr/bin/tail", "tail", arg1.c_str(), "-n 5", NULL);
非常感谢任何帮助!
【问题讨论】:
-
~被 shell 翻译到主目录。如果您正在编写自己的 shell,则需要自己做。
标签: c++ linux bash shell system-calls