#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LINE 80 /* Maximum length of command*/
struct node
{
char commandName[41];
struct node *next;
}*start=NULL;
void insert_at_beg(char cmd[])
{
struct node *new_node,*current;
new_node=(struct node *)malloc(sizeof(struct node));
if(new_node == NULL)
printf("nFailed to Allocate Memory");
strcpy(new_node->commandName, cmd);
new_node->next=NULL;
if(start==NULL)
{
start=new_node;
current=new_node;
}
else
{
new_node->next=start;
start=new_node;
}
}
void display()
{
struct node *temp;
temp=start;
while(temp!=NULL)
{
printf("\t%s\n",temp->commandName);
temp=temp->next;
}
}
上面的代码是一个链表,它是使用结构实现的,用于在我自己的shell中实现历史记录功能。 insert_at_beg()用于将我们在shell上输入的命令作为节点添加到列表中,display()用于显示列表。
以下是主要功能。在这个函数中,我创建了自己的shell
int main()
{
char *args[MAX_LINE/2+1]; /* Command Line Argument*/
int should_run=1, status, i, num, error;
pid_t pid;
char str[41];
char teststr[10]={"history\0"};
char temprory[41];
const char delimiter[2]=" ";
char *token;
while(should_run)
{
i=0;
printf("osh>");
fflush(stdout);
fgets(str, sizeof str, stdin);
str[strlen(str)-1]='\0';
strncpy(temprory, str, sizeof(temprory));
token=strtok(str, " ");
while(token)
{
args[i]=strdup(token);
i++;
token=strtok(NULL, " ");
}
insert_at_beg(args[0]);
if((strcmp(args[0],teststr))==0)
{
display();
}
else
{
;
}
pid=fork();
if(pid<0) // error in creating child process
{
printf("\tError in creating child process\n");
}
else if(pid==0) //child process will execute this block
{
error=execvp(args[0], args); //execvp() always return -1 for any
if(error==-1) //command I type in i.e. that command
{ //is not found and hence not executed.
printf("bash:command not found\n");
}
exit(1);
}
else //parent process will execute this block
{
pid=wait(&status);
if(!strcmp(args[0], "exit"))
{
should_run=0;
}
}
}
return 0;
}
如何处理此问题并使其有效?我很久以来就陷入了这种境地。需要帮助。
答案 0 :(得分:1)
引自man 3 execvp
:
execv(),execvp()和execvpe()函数提供了一个指向以null结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。指针数组必须以空指针终止。
虽然没有使用空指针终止args
数组。
添加以下行:
args[i] = NULL;
循环之后:
while(token)
{
args[i]=strdup(token);
i++;
token=strtok(NULL, " ");
}
解决您的问题。 (至少在我的笔记本电脑上问题解决了。)