主要思路:
- 获取命令行
- 解析命令行
- 建立一个子进程
- 替换子进程程序
- 父进程等待子进程退出
代码如下
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
char *argv[ 8 ] ;
int argc=0;
void do_parse( char *buf)
{
int i;
argc=0;
int status=0;
for( ;buf[ i]!=0;i++)
{
if( !isspace( buf[ i])&&status==0)
{
argv[argc++]=buf+i;
status=1;
}
else if( isspace( buf[i]))
{
status=0;
buf[ i]=0;
}
}
argv[ argc];
}
void do_execute( void)
{
pid_t pid=fork( );//创建子进程
if( pid<0)
{
perror( " fork ");
exit( EXIT_FAILURE);
}
else if( pid==0)
{
execvp( argv[ 0],argv); //子进程替换程序
perror( " execvp");
exit( EXIT_FAILURE);
}
else
{
int st;
while( wait( &st)!=pid) //父进程等待
{
;
}
}
}
int main( )
{
char buf[ 1024];
while( 1)
{
printf( " myshell> ");
fflush( stdout);
scanf( " %[ ^\n ]*c",buf); //命令行读取
do_parse( buf);
do_execute( );
}
return 0;
}
运行结果:
root@localhost my_shell]# ./a.out
myshell> ls
Segmentation fault (core dumped)
[root@localhost my_shell]# pwd
/home/zyc/linux/file_io/my_shell
[root@localhost my_shell]# cd ..
[root@localhost file_io]# cd my_shell
[root@localhost my_shell]# cat my_shell.c
这只是一个简单的shell,不支持重定向,也不支持追加功能
后续会继续更行…