Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
execl()查找命令c_C_Linux_Find_Exec - Fatal编程技术网

execl()查找命令c

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

我想对shell执行find命令,只打印*.c文件 然后返回字符串和文件,并将其打印到stdout。 我用管子来做这件事。当我尝试运行时,我总是得到
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,是否可以帮助我打印结果?是否可以帮助我打印结果?是否可以帮助我打印结果?是否可以帮助我打印结果?