命令行参数未在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);

你的程序应该工作。