命令行参数未在C中执行
我试图将参数传递给ls命令的execl()函数。 但是当我通过时
/bin/ls -l -a
作为我的程序的参数,execl()函数不识别最后两个参数。 为什么?这是代码:
#include #include int main(int argc, char *argv[]) { int i,childpid; if(argc!=4) { printf("you didn't provide any commandline arguments!\n"); return 0; } childpid=fork(); if(childpid0); printf("My ID %d, Parent ID %d, CHild ID %d\n", getpid(),getppid(),childpid); return 0; }
我在Ubuntu上。
问候
当你运行你的程序时, /bin/ls
似乎忽略了-l
参数,因为它是在为argv[0]
保留的位置传递的,这通常是(相当无用的)程序名。
具体来说, execl
的第一个参数是要运行的程序,其余参数将按原样复制到argv
vector。 由于argv[0]
应包含程序名称,而实际参数从argv[1]
开始,因此必须通过提供程序名称两次来补偿:
execl(argv[1], argv[1], argv[2], argv[3], (char *) NULL);
代码中的一个错误是使用NULL
作为execl()
的最后一个参数。 来自man execl :
execl(),execlp()和execle()函数中的const char * arg和后续省略号可以被认为是arg0,arg1,…,argn。 它们一起描述了一个或多个指向以null结尾的字符串的指针的列表,这些字符串表示执行程序可用的参数列表。 按照惯例,第一个参数应指向与正在执行的文件关联的文件名。 参数列表必须由NULL指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针(char *)NULL。
请参阅问题如何在程序中获取空指针? 来自C FAQ,在其示例中特别提到了excel()
。
在添加#include
之前,代码对我不起作用
据我所知,函数exec,execl等在unistd.h中声明,而不是在stdlib.h中声明。
如果我只使用stdlib.h和stdio.h进行编译,我会收到警告。
test.c: In function 'main': test.c:24:9: warning: incompatible implicit declaration of built-in function 'execl' [enabled by default]
如果你添加unistd.h,并将exec调用更改为
execl(argv[1], argv[1], argv[2], argv[3],NULL);
你的程序应该工作。