1

我正在尝试创建一个简单的 shell 程序来执行输入中指定的程序。有两个主要功能:(scanner()用于strtok拆分token中的输入)和execute()(fork进程并执行程序)。

不幸的是它不起作用......我试图string[0]在. 第一次输出是正确的,但第二次似乎是在一系列随机数中修改的,所以不起作用......scanner()execute()string[]execvp()

我真的无法弄清楚为什么string[]更改的值,可能是一个非常愚蠢的错误,但我看不到它。我真的需要你的帮助!谢谢指教。

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

#define DIM 256

int scanner(char*[]);
int execute(char*[]);

int main()
{
    char* string[DIM]; 

    scanner(string);
    execute(string);

}

/* scan:    read the input in token*/
int scanner(char* string[])
{
    char input[1024];
    char delimit[]=" \t\r\n\v\f"; 
    int i = 0;

    if(fgets(input, sizeof input, stdin)) {
        string[i] = strtok(input, delimit);
        while(string[i]!=NULL){
            i++;
            string[i]=strtok(NULL,delimit);
        }
        return 0;
    }
    return 1;
}
/* execute:    execute the command*/
int execute(char* string[])
{
    int pid;
    printf("%s\n", string[0]);
    switch(pid = fork()){
        case -1:
            return 1;
        case 0:
            execvp(string[0], string);
            return 1;
        default:
            wait((int*)0);
            return 0;
    }
}
4

1 回答 1

3

其中的字符串变量inputscanner一个局部变量,存储类为“auto”。这意味着当该函数返回时,该变量会消失,并且它占用的内存可以重新用于其他事情。这是不幸的,因为strtok返回指向字符串变量的指针。

于 2016-10-14T12:52:54.243 回答