execl()查找命令c
我想对shell执行find命令,只打印*.c文件 然后返回字符串和文件,并将其打印到stdout。 我用管子来做这件事。当我尝试运行时,我总是得到execl()查找命令c,c,linux,find,exec,C,Linux,Find,Exec,我想对shell执行find命令,只打印*.c文件 然后返回字符串和文件,并将其打印到stdout。 我用管子来做这件事。当我尝试运行时,我总是得到find失败:没有这样的文件或目录 我认为问题在于路径。 我应该给它的路径是home/username/Downloads,以防我想打印下载文件夹中的所有*.c文件 #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv){ int
find失败:没有这样的文件或目录
我认为问题在于路径。
我应该给它的路径是home/username/Downloads
,以防我想打印下载文件夹中的所有*.c文件
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char ** argv){
int fds[2];
char buffer[4096];
if(pipe(fds) == -1){
perror("pipe creation failed");
exit(1);
}
switch (fork()){
case 0://child
close(fds[0]);
execl("usr/bin/find","find","home/username/Downloads", "-name \"*.c\" -print0",NULL);
perror("find failed");
exit(20);
break;
case -1: //fork failure
perror("fork failure");
exit(1);
default: //parent
close(fds[1]); //close stdin so only can do stdout
int size= read(fds[0],buffer, 4096);
printf("%s",buffer);
}
exit(1);
}
#包括
#包括
int main(int argc,字符**argv){
int-fds[2];
字符缓冲区[4096];
如果(管道(fds)=-1){
perror(“管道创建失败”);
出口(1);
}
开关(fork()){
案例0://儿童
关闭(fds[0]);
execl(“usr/bin/find”、“find”、“home/username/Downloads”、“-name\”*.c\“-print0”、NULL);
perror(“查找失败”);
出口(20);
打破
案例-1://分叉故障
perror(“分叉故障”);
出口(1);
默认值://parent
close(fds[1]);//关闭stdin以便只能执行stdout
int size=read(fds[0],缓冲区,4096);
printf(“%s”,缓冲区);
}
出口(1);
}
usr/bin/find前面缺少一个前导斜杠,因此只有在工作目录为/时才会执行find,usr/bin/find前面缺少一个前导斜杠,因此只有在工作目录为/时才会执行find,因此,仅当工作目录为/时,才会执行查找。usr/bin/find前面缺少一个前导斜杠,因此,仅当工作目录为/时,才会执行查找。我建议将单独的参数作为单独的参数传递:
execl("/usr/bin/find", "find",
"/home/username/Downloads",
"-name",
"*.c", /* As no shell is invoked no quotation marks are needed to protect the *. */
"-print0",
(char *) NULL);
我建议将单独的参数作为单独的参数传递:
execl("/usr/bin/find", "find",
"/home/username/Downloads",
"-name",
"*.c", /* As no shell is invoked no quotation marks are needed to protect the *. */
"-print0",
(char *) NULL);
我建议将单独的参数作为单独的参数传递:
execl("/usr/bin/find", "find",
"/home/username/Downloads",
"-name",
"*.c", /* As no shell is invoked no quotation marks are needed to protect the *. */
"-print0",
(char *) NULL);
我建议将单独的参数作为单独的参数传递:
execl("/usr/bin/find", "find",
"/home/username/Downloads",
"-name",
"*.c", /* As no shell is invoked no quotation marks are needed to protect the *. */
"-print0",
(char *) NULL);
argv[0]是程序名,而不是程序的第一个参数确定您是对的。我现在就编辑您应该使用glob()函数。另请参见readdir()或stat(),
home/username/Downloads
前面不应该有斜杠吗?或者home
是程序运行所在目录中的一个目录吗?@squemish在usr/bin/findargv[0]前面的相同目录是程序名,而不是程序的第一个参数确定您是对的。我现在就编辑您应该使用glob()函数。另请参见readdir()或stat(),home/username/Downloads
前面不应该有斜杠吗?或者home
是程序运行所在目录中的一个目录吗?@squemish在usr/bin/findargv[0]前面的相同目录是程序名,而不是程序的第一个参数确定您是对的。我现在就编辑您应该使用glob()函数。另请参见readdir()或stat(),home/username/Downloads
前面不应该有斜杠吗?或者home
是程序运行所在目录中的一个目录吗?@squemish在usr/bin/findargv[0]前面的相同目录是程序名,而不是程序的第一个参数确定您是对的。我现在就编辑您应该使用glob()函数。另请参见readdir()或stat(),home/username/Downloads
前面不应该有斜杠吗?或者home
是程序运行所在目录中的一个目录吗?@squamish在usr/bin/finduse dup()或dup2()前面使用相同的目录重定向find的stdoutus dup()或dup2()以重定向find的stdoutus dup()或dup2()以重定向find的stdoutus dup()或dup2()若要重定向find的stdoutca,是否可以帮助我打印结果?是否可以帮助我打印结果?是否可以帮助我打印结果?是否可以帮助我打印结果?