C execvp将不执行“ ls -l”命令,但将执行“ ls”

时间:2019-10-11 06:17:34

标签: c

#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag;
void catch (int sig)
{

  if (sig == SIGINT){
  flag = 1;
  }

  if (sig == SIGHUP){
  flag == 2;
  }
}



int main ()
{
  int i;
  char *nargs[40];
  nargs[0] = "ls-l";
  signal(SIGINT, catch);
  signal(SIGHUP, catch);
  i = 2;
  while(i == 2){
   if (flag == 1){
        execvp(nargs[0],nargs);
   }
   if (flag ==2){
        execvp(nargs[1],nargs);
   }

 }
  return 0;
}

此处,当nargs [0]设置为“ ls-l”或“ ls -l”时,它将不执行SIGINT上的命令,但是当nargs [0]设置为“ ls”时,它将仅执行命令精细。我究竟做错了什么? while循环条件只是它永远循环的一种方式。

1 个答案:

答案 0 :(得分:2)

execvp()不会启动外壳程序,它会尝试直接在$PATH中查找您指定的二进制文件。因此,如果您在Shell的启动脚本中创建了别名ls-l,则execvp()将不起作用。如果需要,请改用system()

如果您打算执行ls -l,则应该执行以下操作:

const char *nargs[] = {"ls", "-l", NULL};
execvp(nargs[0], nargs);

最后,如果您确实要获取文件列表,则无需调用ls,应使用opendir() + readdir(),或者使用{{1} }在POSIX平台上。