2

簡単にするために、プログラムを修正しました。私がやりたいことは、実行時に任意の数のパラメーターを受け入れて、それを に渡すことexeclp()です。未使用の(残りの)スロットが(この場合は)にm[][]渡されるように、固定長の2次元配列を使用しています。NULLexeclpm[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引数は1つだけであり、execle()もNULL引数のに環境ポインターを必要とします。

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

これは文字の 2D 配列です。

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 です。SO char *argv[] 引数の最後の要素は、execlp() 関数の終了引数として使用できます。

于 2012-08-05T17:56:09.920 に答える