自己编写的的shell不能执行外部命令
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<stdio.h>
#include<string.h>
#include <signal.h>
#define MAXLINE 128
#define MAXARGC 128
typedef struct PC
{
char pc_name[20];
pid_t t;
//int state;
struct PC *next;
}Process;
Process *head;
extern char **environ;
char p[][20] = {"cd","environ","echo","help","jobs"};
void cmdLine_Analyse(char *cmdLine,char **argv,char cmd[]);
int cmdRun(char **argv,char cmd[]);
int cd_fun(char **argv);
void environ_fun();
void echo_fun(char **argv);
int help_fun();
int jobs_fun(char **argv);
int Is_Outcmd(char **argv);
void CreateProcessNode();
void InsertProcessNode(char *cmd,pid_t t);
void DeleteProcessNode(pid_t pid);
static void wait_child(int sig_type);
void set_singnal();
int new;
///////////////////////////////////////////main//////////////////////////////
int main()
{
//process Pcb;
char *argv[MAXARGC];
char dir[MAXARGC];
char cmdLine[MAXLINE];
char cmd[MAXARGC];
int n = 0,i;
CreateProcessNode();
while(1)
{
printf("[%s]$PS1",get_current_dir_name());
gets(cmdLine);
//strcpy(cmdLine,"date");
if(cmdLine[strlen(cmdLine) - 2] == '&')
new = 1;
if(!strcmp(cmdLine,"quit") || !strcmp(cmdLine,"exit") || !strcmp(cmdLine,"bye"))
break;
cmdLine_Analyse(cmdLine,argv,cmd);
cmdRun(argv,cmd);
}
return 0;
}
///////////////////////////////////////////////signal///////////////////////////////////////////////////////////
static void wait_child(int sig_type)
{
int status;
pid_t pid = wait(&status);
DeleteProcessNode(pid);
}
void set_signal()
{
if (signal(SIGCHLD, wait_child) == SIG_ERR) {
perror("Signal");
exit(EXIT_FAILURE);
}
}
/////////////////////////////cmdLine_devide////////////////////////////////////////
void cmdLine_Analyse(char *cmdLine, char **argv,char cmd[] )
{
char *temp;
temp = strtok(cmdLine , " ");
int argc = 0;
while(temp != NULL)
{
if(argc == 0)
{
strcpy(cmd,temp);
}
argv[argc++] = temp;
temp = strtok(NULL," ");
}
if(!strcmp(argv[argc-1],"&"))
{
argv[argc - 1] = '\0';
new = 1;
}
else
argv[argc] = NULL;
}
///////////////////////////////cmdRun/////////////////////////////////////////
int cmdRun(char **argv,char cmd[])
{
int i;
for(i = 0;i < 5;i++)
{
if(!strcmp(p[i],cmd))
break;
}
switch(i)
{
case 0:
cd_fun(argv);
break;
case 1:
environ_fun();
break;
case 2:
echo_fun(argv);
break;
case 3:
help_fun();
break;
case 4:
Jobs_fun();
break;
}
if(i == 5)
{
if(!Is_Outcmd(argv))
{
printf("ERROR");
}
//Is OutCmd
}
}
////////////////////////////echo_fun////////////////////////////////////////
void echo_fun(char **argv)
{
char **var;
for(var = argv + 1; *var != NULL;var++)
{
printf("%s ",*var);
}
printf("\n");
}
//////////////////////////////////////cd_fun////////////////////////////////
int cd_fun(char **argv)
{
if(chdir(argv[1]))
{
printf("改变目录失败\n");
}
return 0;
}
void environ_fun()
{
char **var;
for(var = environ; *var != NULL; var++)
{
printf("%s\n",*var);
}
}
int help_fun()
{
printf("\t\t**********功能及使用方法*************\n");
printf("\t\t cd <目录> 更改当前目录到另一个 <目录>\n");
printf("\t\tenviron列出所有环境变量字符串的的设置\n");
printf("\t\t echo <内容> 显示echo后的内容且换行\n");
printf("\t\t jobs输出shell当前的一系列子进程\n");
return 0;
}
////////////////////////////////////Is_Outcmd///////////////////////////////
int Is_Outcmd(char **argv)
{
pid_t pid;
set_signal();
pid = fork();
if(pid < 0)
{
printf("fork error\n");
exit(EXIT_FAILURE);
}
if(pid == 0)
{
if(execv(argv[0],argv) < 0)
{
printf("excev error\n");
return 0;
}
}
if(pid > 0)
InsertProcessNode(argv[0],pid);
if(new == 1)
waitpid(pid,0,WNOHANG);
else
waitpid(pid,0,0);
exit(0);
}
//////////////////////////////List Job/////////////////////////////////////
int Jobs_fun(char **argv)
{
Process *q;
q = p;
printf("NAME/tPID");
while(q->next)
{
printf(" %s /t %d\n",q->pc_name,q->t);
q = q->next;
}
}
/////////////////////////////////Record///////////////////////////////////
void CreateProcessNode()
{
head = (Process *)malloc(sizeof(Process));
strcpy(head->pc_name,"shell");
head->t = 0;
head->next = NULL;
}
void InsertProcessNode(char *cmd,pid_t t)
{
Process *q;
q = (Process *)malloc (sizeof(Process));
strcpy(head->pc_name,cmd);
q->t = t;
q->next = head->next;
head->next = q;
}
void DeleteProcessNode(pid_t pid)
{
Process *q,*temp;
temp = q = head;
while(q->t == pid)
{
temp = q;
q = q->next;
}
temp->next = q->next;
free(q);
}
[解决办法]
怎么个不能执行法??
[解决办法]
你这是C程序。你所谓的“不能执行”不会是指不能像shell脚本那样写完了就可以执行吧?