#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循环条件只是它永远循环的一种方式。
答案 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平台上。