0

lsコマンドのexecl()関数に引数を渡そうとしています。しかし、私が合格すると

/bin/ls -l -a

私のプログラムの引数として、execl()関数は最後の2つの引数を認識しません。それはなぜですか?コードは次のとおりです:

#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、引数を無視しているように見えます。これは通常、(かなり役に立たない)プログラム名です。-largv[0]

具体的には、の最初の引数execlは実行するプログラムであり、残りの引数はargvそのままベクトルにコピーされます。argv[0]はプログラム名を含むことが期待され、実際の引数はから始まるためargv[1]、プログラム名を2回指定して補正する必要があります。

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

コードの1つの間違いは、NULLの最後の引数としての使用ですexecl()man execlから:

execl()、execlp()、およびexecle()関数のconst char * argとそれに続く楕円は、arg0、arg1、...、argnと考えることができます。それらは一緒に、実行されたプログラムで使用可能な引数リストを表すnullで終了する文字列への1つ以上のポインタのリストを記述します。慣例により、最初の引数は、実行されているファイルに関連付けられているファイル名を指す必要があります。引数のリストはNULLポインターで終了する必要があり、これらは可変個引数関数であるため、このポインターは(char *)NULLをキャストする必要があります。

プログラムでnullポインタを取得するにはどうすればよいですか?excel()その例で具体的に言及しているCFAQから。

于 2012-11-18T08:41:44.220 に答える
0

追加するまでコードは機能しません#include<unistd.h>

私の知る限り、関数exec、execlなどはstdlib.hではなくunistd.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 に答える