2

これまでのところ私が混乱している唯一の部分は、現在の作業ディレクトリとして最初のパラメーターを使用して execv をセットアップする方法です。私は両方の「。」を試しました。および "~" は、どちらも画面に対して何も実行していません。「/」も同様。および「/~」。execv を次のように実行する方法について混乱しています。

$ ./prog ls -t -al

そして、現在のディレクトリ、またはファイルと同じディレクトリ (誰がそれを使用しているかによって異なります) で、プログラムの実行後に (argv に格納されている) コマンドを実行します。

私のコード:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void main(int argc, char *argv[])
{
    int pid;
    int count = 0;
    char *argv2[argc+1];

    for(count = 0; count < argc-1; count++){
        argv2[count] = argv[count+1];
        printf("Argv2: %s\n", argv2[count]);  //just double checking
        argv2[argc-1] = NULL;
    }

    pid = fork();
    if(pid == 0){
        printf("Child's PID is %d. Parent's PID is %d\n", (int)getpid, (int)getppid());
        execv(".", argv2);       //<---- confused here
    }
    else{
        wait(pid);
        exit(0);
    }
}

出力例:

$ ./prog ls -t -al
Argv2: ls
Argv2: -t
Argv2: -al
Child's PID is 19194. Parent's PID is 19193
4

6 に答える 6

3

execvを使用する必要があると思います。execvpは、PATH設定でコマンドを検索するため、非常に優れています。

execv(".", argv2);       //<---- confused here

..。

#include <errno.h>
#include <string.h>
if ( execv(argv2[0],argv2) )
{
    printf("execv failed with error %d %s\n",errno,strerror(errno));
    return 254;  
}

wait(pid);

..。

pid_t wait_status = wait(&pid);
于 2012-09-25T11:19:15.997 に答える
1
/* main() returns int */
int main(int argc, char *argv[])
{
        int pid;

        pid = fork();
        if(pid == 0){
                printf("Child's PID is %d. Parent's PID is %d\n"
                      , (int)getpid, (int)getppid());
                execv(argv[1], argv+1);
        }
        else{
        wait(NULL);
        exit(0);
        }

        return 0;
}

更新: execv()には、実行可能ファイルの絶対パスが必要です。現在のディレクトリ内のファイルの場合、そのパスを作成する必要があります (たとえば、pwd() を介して)。$PATH 環境変数を介して実行可能ファイルを検索する場合は、すべての検索を行う execvp() を使用できます。

于 2012-09-26T13:16:19.170 に答える
1

最初の引数は、慣例により、実行中のファイルに関連付けられたファイル名を指す必要があります。exec したいlsので、最初の引数は である必要があります/bin/ls。つまり、コードは

execv("/bin/ls", argv2);

あなたはそれを試すことができます

于 2012-09-25T05:17:14.180 に答える
0

execv() の最初の引数は、実行するディレクトリではなく、実行するファイルへのパスです。デフォルトでは、実行プログラムは呼び出し元の現在のディレクトリのコンテキストで実行されます。

于 2012-09-25T03:39:34.467 に答える