1

このコードを使用していくつかのシェルコマンドを実行していますが、コマンドの後に終了しますls.: どこが間違っていますか?

#include <stdio.h>
#include <unistd.h>
#include <errno.h>

#define MAX_LINE 80 /* The maximum length command */

void setup(char inputBuffer[], char *args[],int *background)
{
    int length,  i, start, ct;    

    ct = 0;

    /* read what the user enters on the command line */
    length = read(STDIN_FILENO,inputBuffer,MAX_LINE);  
    start = -1;
    if (length == 0)
        exit(0);            /* ^d was entered, end of user command stream */

    if ( (length < 0) && (errno != EINTR) ) {
        perror("error reading the command");
    exit(-1);           /* terminate with error code of -1 */
    }

    printf(">>%s<<",inputBuffer);
    for (i=0;i<length;i++){ /* examine every character in the inputBuffer */

        switch (inputBuffer[i]){
        case ' ':
        case '\t' :               /* argument separators */
    if(start != -1){
                args[ct] = &inputBuffer[start];    /* set up pointer */
        ct++;
    }
            inputBuffer[i] = '\0'; /* add a null char; make a C string */
    start = -1;
    break;

            case '\n':                 /* should be the final char examined */
    if (start != -1){
                args[ct] = &inputBuffer[start];     
        ct++;
    }
            inputBuffer[i] = '\0';
            args[ct] = NULL; /* no more arguments to this command */
    break;

        default :             /* some other character */
    if (start == -1)
        start = i;
            if (inputBuffer[i] == '&'){
      *background  = 1;
              inputBuffer[i-1] = '\0';
    }
} /* end of switch */
 }    /* end of for */
 args[ct] = NULL; /* just in case the input line was > 80 */

for (i = 0; i <= ct; i++)
         printf("args %d = %s\n",i,args[i]);
} /* end of setup routine */

int main(void)
{
char inputBuffer[MAX_LINE]; /*buffer to hold command entered */
    int background; /* equals 1 if a command is followed by '&' */
    char *args[MAX_LINE/2 + 1]; /*command line arguments */
int should_run = 1; /* flag to determine when to exit program */
while (should_run) {
    //background=0;
    printf("Msh>");
    fflush(stdout);
    setup(inputBuffer, args, &background);
    execvp(args[0], args);
}
return 0;
}
4

2 に答える 2

1

Kerrek SB が既に言ったように、execvp戻りません。

もう少し情報を追加するには:execv関数のファミリは、プロセス (実行中のプログラム) を別のプロセスに置き換えます。これは、 と連携して、 通話fork内で発生することです。system()

もっと率直に言うと:

C プログラムからシステム コマンドを実行し、「戻り値」に基づいて続行する場合は、system()呼び出しを使用する必要があります。を参照してください。

別の実行可能ファイルを実行する必要がある子プロセスを生成する場合はfork、子プロセス内で を使用する必要がありますexecv。次のを参照してください。

于 2013-11-29T14:11:56.677 に答える
1

execvp を返さないことに注意してください。

于 2013-11-29T14:02:53.290 に答える