execvp()没有在我自己的shell中执行任何命令

时间:2014-02-24 03:37:30

标签: c

#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;
 }

如何处理此问题并使其有效?我很久以来就陷入了这种境地。需要帮助。

1 个答案:

答案 0 :(得分:1)

引自man 3 execvp

  

execv(),execvp()和execvpe()函数提供了一个指向以null结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。指针数组必须以空指针终止。

虽然没有使用空指针终止args数组。

添加以下行:

args[i] = NULL;
循环之后

while(token)
{
   args[i]=strdup(token);
   i++;
   token=strtok(NULL, " ");
}

解决您的问题。 (至少在我的笔记本电脑上问题解决了。)