我正在尝试在给定inode编号的情况下打印文件名。我正在使用execlp
系统调用来运行find
命令。我的代码如下所示:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
char str[8];
char *ptr;
ptr=str;
long x=9306140;
snprintf(str,8,"%ld", x);
execlp("find"," ","~"," ","-inum"," ",str,NULL);
}
但是我收到一个错误:无效的参数&#39; 9306140&#39;到-inum。 有人可以帮忙吗?
答案 0 :(得分:2)
如评论中所述,您不希望" "
参数列表中包含execlp()
(空格)参数。 shell接受一个带有分隔参数的空格的字符串,但它将空格之间的内容视为传递给命令的单词;它通常不会将空格传递给命令。 (对于这个练习来说,这是一个简单而充分的解释;可以添加一些警告和狡猾的单词。)
shell还会扩展~
以匹配$HOME
环境变量中的值(与~user
相比,后者从密码文件中获取user
的主目录 - 他们通常但不一定相同。
您为该号码分配的字符串大小的误差也很小。坦率地说,你应该只使用一个字符串。所有这些变化导致:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
const char *home = getenv("HOME");
const char inode[] = "9306140";
execlp("find", "find", home, "-inum", inode, (char *)NULL);
fprintf(stderr, "failed to execute 'find' command\n");
return(EXIT_FAILURE);
}
注意重复的"find"
;第一个是沿路径搜索后要执行的文件的名称;第二个是作为argv[0]
提供的值。您可以将"hypochondriac"
作为第二次出现,find
可能会相同,最坏的情况是报告其错误消息来自程序&#39; hypochondriac
&#39 ;
下一步是从命令行参数中获取inode编号:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
fprintf(stderr, "Usage: %s inode\n", argv[0]);
exit(EXIT_FAILURE);
}
const char *home = getenv("HOME");
const char *inode = argv[1];
execlp("find", "find", home, "-inum", inode, (char *)NULL);
fprintf(stderr, "%s: failed to execute 'find' command\n", argv[0]);
return(EXIT_FAILURE);
}
之后的步骤是处理多个inode值;此时,您使用的是execvp()
而不是execlp()
(或者,如果您是绝望和懒惰,则每个inode循环一次fork()
和execlp()
数字,但这根本没有任何理由抨击你的系统。)