[英]dynamic parameter passing to execlp() function in C
为简单起见,我修改了程序。 我想做的是在运行时接受任意数量的参数,并将其传递给execlp()
。 我正在使用固定长度的2d数组m[][]
,以便任何未使用的(剩余的)插槽都可以作为NULL
传递给execlp
(在这种情况下为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;
}
我该怎么做?
由于您想接受任意数量的参数,因此您应该使用的是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 ...个参数,则应为每个不同数量的参数编写单独的调用。 任何其他都不是完全可靠的。
#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 之后还需要环境指针。
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()函数中的终止参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.