2

为了简单起见,我修改了我的程序。我想要做的是在运行时接受任意数量的参数并将其传递给execlp(). 我正在使用固定长度的二维数组m[][],这样任何未使用的(剩余的)插槽都可以传递NULLexeclp(在这种情况下m[2][])。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main() {
    char m[3][5], name[25];
    int i;
    strcpy(name, "ls");
    strcpy(m[0], "-t");
    strcpy(m[1], "-l");
    //To make a string appear as NULL (not just as an empty string)
    for(i = 0; i < 5; i++)
        m[2][i] = '\0'; // or m[2][i] = 0 (I've tried both)
    execlp(name, m[0], m[1], m[2], '\0', 0, NULL);  
    // Does not execute because m[2] is not recognized as NULL
    return 0;
    }

我该怎么做?

4

3 回答 3

3

由于您想接受任意数量的参数,因此您应该使用的是execvp()代替execlp()

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

int main(void)
{
    char *argv[] = { "ls", "-l", "-t", 0 };
    execvp(argv[0], argv);
    fprintf(stderr, "Failed to execvp() '%s' (%d: %s)\n", argv[0], errno,
            strerror(errno));
    return(EXIT_FAILURE);
}

execvp()函数采用数组形式的任意长度的参数列表,这与execlp()您编写的任何单个调用仅采用固定长度的参数列表不同。如果您想容纳 2、3、4、... 参数,您应该为每个不同数量的参数编写单独的调用。其他任何事情都不完全可靠。

于 2012-08-05T17:57:01.690 回答
1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main() {
    char *args[] = {"ls", "-t", "-l" };
    execlp(args[0], args[0], args[1], args[2], NULL);
    perror( "execlp()" );
    return 0;
    }

为简单起见,我用一个固定的指针数组替换了所有字符串管理的东西。execlp() 只需要一个最终的 NULL 参数,execle() 还需要在 NULL arg之后的环境指针。

于 2012-08-05T17:40:51.193 回答
0
 char m[3][5];

这是一个二维字符数组。

m[2] is a element of the 2D array that is it it a 1D Array of characters.

所以它总是有一个常量地址。它永远不会是 NULL,因为它是一个不能为 NULL 的常量地址。同样它不能分配给 NULL,所以你必须使用 NULL 作为最后一个参数。

execlp() 使用 NULL 作为终止参数,因此您必须提及它。

如果使用命令行参数,则最后一个命令行参数始终为 NULL。所以 char *argv[] 参数的最后一个元素可以用作 execlp() 函数中的终止参数。

于 2012-08-05T17:56:09.920 回答