我正在尝试将参数传递给ls命令的execl()函数。但是当我通过时
/bin/ls -l -a
作为我的程序的参数,execl()函数无法识别最后两个参数。为什么?这是代码:
#include <stdio.h>
#include <stdlib.h>
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(childpid<0)
{
printf("fork() failed\n");
return 0;
}
else
if(childpid==0)
{
printf("My ID %d\n\n",getpid());
execl(argv[1],argv[2], argv[3],NULL);
printf("If you can see this message be ware that Exec() failed!\n");
}
while(wait(NULL)>0);
printf("My ID %d, Parent ID %d, CHild ID %d\n", getpid(),getppid(),childpid);
return 0;
}
我在Ubuntu上。
此致
答案 0 :(得分:2)
运行程序时/bin/ls
似乎忽略-l
参数,因为它是在为argv[0]
保留的位置传递的,这通常是(相当无用的)程序名称。
具体来说,execl
的第一个参数是要运行的程序,其余参数按原样复制到argv
向量。由于预期argv[0]
包含程序名称且实际参数从argv[1]
开始,因此必须通过提供程序名称两次来补偿:
execl(argv[1], argv[1], argv[2], argv[3], (char *) NULL);
答案 1 :(得分:1)
代码中的一个错误是使用NULL
作为execl()
的最后一个参数。来自man execl:
execl(),execlp()和execle()函数中的const char * arg和后续省略号可以被认为是arg0,arg1,...,argn。它们一起描述了一个或多个指向以null结尾的字符串的指针的列表,这些字符串表示执行程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。 参数列表必须由NULL指针终止,并且由于这些是可变参数函数,因此必须将此指针强制转换为(char *)NULL。
请参阅C FAQ中的问题How do I get a null pointer in my programs?,该问题在其示例中特别提及excel()
。
答案 2 :(得分:0)
在我添加#include<unistd.h>
据我所知,函数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);
你的程序应该有效。