命令行参数未在C中执行

时间:2012-11-18 08:35:01

标签: c terminal exec fork

我正在尝试将参数传递给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上。

此致

3 个答案:

答案 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);

你的程序应该有效。