/*************************************************************************
> File Name: myshell.c
> Author:
> Mail:
> Created Time: 2017年02月22日 星期三 19时34分38秒
************************************************************************/
#include<stdio.h>
#include<pwd.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<ctype.h>
#define INFO_BUFFER_SIZE 256
int main()
{
int count = 1;
while(1)
{
struct passwd *pwd;
pwd = getpwuid(getuid());//获取当前用户名
//获取当前主机名
char infoBuf[INFO_BUFFER_SIZE];
gethostname(infoBuf,INFO_BUFFER_SIZE);
//获取当前路径
char _pwd[INFO_BUFFER_SIZE];
getcwd(_pwd,sizeof(_pwd));
printf("%s@%s:%s $ ",pwd->pw_name,infoBuf,_pwd);
fflush(stdout);
char cmd[128];
size_t _s = read(0,cmd,sizeof(cmd)-1);
if(_s > 0) //read success,_s is read number
{
cmd[_s-1] = '\0';
}else if(_s <= 0){
perror("read");
return 1;
}
char* _argv[32];//save cmd
_argv[0] = cmd;
char* start = cmd;// pointer is a falg
int i = 1;
while(*start)
{
if(isspace(*start)){
*start = '\0';
start++;
_argv[i] = start;
i++;
continue;
}
start++;
}
_argv[i] = NULL;
pid_t id =fork();
if(id < 0){
perror("fork");
}
else if(id == 0){
//child
execvp(_argv[0],_argv);
exit(1);
}
else if(id > 0){
//father
int status = 0;
pid_t ret = waitpid(id,&status,0);
if(WIFEXITED(status)&&ret == id)
;
// printf("wait success\n");
else{
printf("wait child failed\n");
return 1;
}
}
}
return 0;
}
简单的shell程序
最新推荐文章于 2023-08-11 15:51:41 发布