0

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

问候

4

3 回答 3

2

运行程序时/bin/ls似乎忽略了-l参数,因为它是在为 保留的位置传递的argv[0],这通常是(相当无用的)程序名称。

具体来说,第一个参数execl是要运行的程序,其余参数argv按原样复制到向量。由于argv[0]预计包含程序名称并且实际参数从 开始argv[1],因此您必须通过提供两次程序名称来进行补偿:

execl(argv[1], argv[1], argv[2], argv[3], (char *) NULL);
于 2012-11-18T08:46:32.087 回答
1

NULL代码中的一个错误是使用execl(). 从man execl

execl()、execlp() 和 execle() 函数中的 const char *arg 和后续省略号可被视为 arg0、arg1、...、argn。它们一起描述了一个或多个指向以空字符结尾的字符串的指针列表,这些字符串表示已执行程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。参数列表必须由 NULL 指针终止,并且由于这些是可变参数函数,因此该指针必须强制转换 (char *) NULL。

请参阅问题如何在我的程序中获取空指针?excel()来自 C FAQ,在其示例中特别提到。

于 2012-11-18T08:41:44.220 回答
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);

你的程序应该可以工作。

于 2012-11-18T08:46:04.790 回答