Shell 구현 (4) 명령 실행 (파이프 구현 포함)
7496 단어 Linux 딥 러 닝
구체 적 인 실현:
void run_shell ( )
{
int i,j;
fd[0] = open ( PIPE_FILE , O_CREAT|O_RDONLY , 0666 );//
fd[1] = open ( PIPE_FILE , O_CREAT|O_WRONLY|O_TRUNC , 0666 );//
for ( i = 0 ; i < cnt_group ; i++ )//
{
l = group[i].first;
r = group[i].last;
int pid = fork();//
//fork , 0, 0
if ( pid == 0 )
run_command ( l , r-1 ); // ( )
else
waitpid ( 0 , NULL , 0 );// , ( )
}
}
그 다음 에 명령 을 집행 하고 파이프 의 설 계 를 생각 하 니 재 귀적 인 생각 이 들 었 다. 교체 도 잘 되 지만 게 으 른 지 재 귀적 으로 쓰 는 지...
void run_command ( int l , int x )
{
//printf ( "%d %d
" , l , x );
pid_t pid;
if ( x != l )// ,
{
pid = fork();
if ( pid==0 )//
run_command ( l , x-1 );
else waitpid ( 0 , NULL , 0 );//
}
//printf ( "where am i %d
" , x );
//
if ( x != l ) dup2 ( fd[0] , fileno(stdin) );
if ( x != r-1 ) dup2 ( fd[1] , fileno(stdout) );
//
execvp ( cmd[x].cmd , cmd[x].param );
}
void run_shell ( )
{
int pipe_fd[2];
int status;
pipe(pipe_fd);
pid_t child1,child2;
if ((child1=fork())!=0)//
{
if ( (child2 = fork()) == 0 )//
{
close ( pipe_fd[1] );
close ( fileno ( stdin ) );
dup2 ( pipe_fd[0] , fileno(stdin));
close ( pipe_fd[0] );
execvp ( cmd[1].cmd , cmd[1].param );
}
else
{
close ( pipe_fd[0]);
close ( pipe_fd[1]);
waitpid ( child2 , &status , 0 );
}
waitpid ( child1 , &status , 0 );
}
else
{
printf ( "subshell 3cmd %d
" , getpid() );
close ( pipe_fd[0] );
close ( fileno(stdout));
dup2 ( pipe_fd[1] , fileno(stdout));
close ( pipe_fd[1] );
execvp ( cmd[0].cmd , cmd[0].param );
}
}
팁
int execvp(const char *file ,char * const argv []);
//execvp() PATH file , , argv 。
pid_t waitpid(pid_t pid,int * status,int options);
//waitpid() , 。
#include
int pipe(int fd[2])
// fd[2]: ,
// 0 -1
int dup2(int oldhandle,int newhandle);
//
#include
int open(constchar*pathname,intflags);
int open(constchar*pathname,intflags,mode_tmode);
// : , -1
close( int )
//