我试图创建一个简单的shell程序来执行输入中指定的程序。有两个主要功能:scanner()
(使用strtok
分隔令牌中的输入)和execute()
(分叉流程并执行程序)。
不幸的是,它不起作用......我已尝试在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;
}
}
答案 0 :(得分:3)
input
中的字符串变量scanner
是一个局部变量,存储类为&#34; auto&#34;。这意味着当该函数返回时,该变量消失,并且它占用的内存可以重新用于其他事情。这很不幸,因为strtok
将指针返回到那个字符串变量。