Linuxウィジェット自身でmyshell(c言語版)を実現
13479 ワード
基本的な考え方:1.印刷プロンプト(現在のユーザー+現在のディレクトリ)2.ユーザー入力コマンド3.切断コマンドはどの部分から構成されているか4.サブプロセスを作成して置換プログラムを実行し、これらのコマンドps:cdコマンドはサブプロセスで親プロセスの現在のディレクトリを変更できないため、単独で処理するしかなく、パイプ、alias簡略化コマンドの一部の機能はまだ実現していない.
#include
#include
#include
#include
#include
#include
//input
//output
// output
int Split(char inptr[], char* output[])
{
//strtok
char* p = strtok(inptr," ");
int i = 0;
while(p!=NULL)
{
output[i] = p;
p = strtok(NULL," ");
i++;
}
output[i] = NULL;
return i;
}
void _create(char* argv[])
{
pid_t ret = fork();
if(ret == 0){
//
if(argv[0])
execvp(argv[0],argv);
exit(-1);
}
else if(ret>0){
//
wait(NULL);
}
else{
//
perror("error");
}
}
//
char* Pwd()
{
//char* pwd;
char* dir = NULL;
dir = (char*)get_current_dir_name();
int len = strlen(dir);
int i = 0;
while(1)
{
if(dir[len-1-i] == '/')break;
++i;
}
//pwd = dir+len-i;
//printf("%s
",pwd);
return dir+len-i;
}
int main()
{
while(1)
{
//
char* pwd1 = Pwd();
//
struct passwd * pwd2;
pwd2 = getpwuid(getuid());
//1.
printf("[%s@localhost %s]$",pwd2->pw_name,pwd1);
fflush(stdout);
//2.
char command[1024] = {0};
gets(command);//
//3. , ,
//
//
char* argv[1024] = {0};
Split(command,argv);
//4.
//cd
if(strcmp(argv[0], "cd")== 0){
chdir(argv[1]);
}
else
_create(argv);
}
return 0;
}