簡體   English   中英

execvp()在我的外殼中不工作

[英]execvp() not working in my shell

我正在試圖做一個小小的外殼。 我的問題是,當我調用execvp() ,出現錯誤。 例如,當我輸入ls -l它返回ls: invalid option -- '

有人可以幫我理解為什么我會收到此錯誤嗎? 對於我的代碼,功能命令split獲取用戶輸入,並將其拆分為單獨的命令。 單獨的命令用;分隔; 字符。

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

#define MAX_CHARACTERS 512
#define HISTORY_SIZE 10

int commandSplit(char *c, char *a[], int t[]) {

int count = 0;
int total = 0;
char *temp[MAX_CHARACTERS];
char *readCommands = strtok(c, ";");
while(readCommands != NULL) {
    printf("Reading full command: %s\n", readCommands);
    temp[count] = readCommands;
    count++;
    readCommands = strtok(NULL, ";");
}
printf("Done reading full commands\n");
for(int i = 0; i  < count; i++) {
    char *read = strtok(temp[i], " ");
    int track = 0;
    while(read != NULL) {
        printf("Reading individual command: %s\n", read);
        a[total] = read;
        track++;
        total++;
        read = strtok(NULL, " ");
    }
    t[i] = track;
}

return count;
}

int main() {

int exitProgram = 0;
char *args[MAX_CHARACTERS];

while(!exitProgram) {

char *commands = (char *)(malloc(MAX_CHARACTERS*sizeof(char)));
int tracker[MAX_CHARACTERS];
int numOfCommands = 0;
printf("tinyshell> ");
fgets(commands, MAX_CHARACTERS, stdin);

if(strlen(commands) == 0) continue;

numOfCommands = commandSplit(commands, args, tracker);
printf("There are %i commands!\n", numOfCommands);

if(strcmp(args[0], "exit") == 0) {
    printf("Exiting\n");
    exitProgram = 1;
    continue;
}

int l = 0;
for(int i = 0; i < numOfCommands; i++) {
    int status;
    char *holder[tracker[i]+1];
    for(int j = 0; j < tracker[i]; j++) {
        holder[j] = args[l];
        printf("Assiging holder:%s\n", holder[j]);
        l++;
    }
    holder[tracker[i]] = NULL;
    printf("What is holder? \n");
    for(int o = 0; o < tracker[i]; o++) printf("%s", holder[o]);
    pid_t p = fork();
    pid_t waiting;
    if(p == 0) {
    printf("I am in child process\n");
    execvp(holder[0], holder);

    fprintf(stderr, "Child process could not execvp!\n");
    exit(1);
    }
    else {
        if(p < 0) {
            fprintf(stderr, "Fork FAILED!\n");
        }
        else {
            waiting = wait(&status);
            printf("Child %d, status %d\n", waiting, status);
        }
    }
    for(int i = 0; i < numOfCommands; i++) {
        args[i] = NULL;
    }
}

}   

return 0;

}

您的問題是fgets() 也讀取換行符 結果, execvp() arguments數組的最后一個參數包含換行符,導致ls抱怨一個無法識別的參數:您准確地傳遞給ls-l\\n 您需要傳遞的只是-l而沒有換行符。

嘗試在fgets調用之后添加以下代碼以修剪輸入緩沖區:

int len;
len = strlen(commands);
if (len > 0 && commands[len-1] == '\n') {
    commands[len-1] = '\0';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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