argv 配列で指定される特定のファイルで stdout と stdin をリダイレクトしたいと考えています。
たとえば、次のようなコマンドを入力すると - ./shell ls > test
「テスト」ファイルにリダイレクトする必要があります。コードを記述せずにそのファイルに自動的にリダイレクトするため、少し混乱しています。 、標準入力をリダイレクトする必要があります。argv[argc-1] と argv[argc-2] を使用してファイル名と ">" または "<" 記号を見つけようとしましたが、後で ">" とファイル名を使用すると、出力が印刷されるようです (その名前と記号を取得する代わりに、そのファイルで ">" "<" の前の引数を歌います)。
基本的には、execvp() と fork() を使用してシェル コマンドを作成しています。
これが私のコードです。静的ファイルでstdoutをリダイレクトできます。
void call_system(char *argv[],int argc)
{
int pid;
int status=0;
signal(SIGCHLD, SIG_IGN);
int background;
/*two process are created*/
pid=fork();
background = 0;
if(pid<0)
{
fprintf(stderr,"unsuccessful fork /n");
exit(EXIT_SUCCESS);
}
else if(pid==0)
{
//system(argv[1]);
/*argument will be executed*/
freopen("CON","w",stdout);
char *bname;
char *path2 = strdup(*argv);
bname = basename(path2);
execvp(bname, argv);
fclose (stdout);
}
else if(pid>0)
{
/*it will wait untill the child process doesn't finish*/
//waitpid(pid,&status,0);
wait(&status);
//int tempid;
//tempid=waitpid(pid,&status,WNOHANG);
//while(tempid!= pid);// no blocking wait
if(!WIFEXITED(status) || WEXITSTATUS(status))
printf("error");
exit(EXIT_SUCCESS);
}
}