簡體   English   中英

動態參數傳遞給C中的execlp()函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM