몇가지 기본적인 기능을 가진 자기 자신의 리눅스 쉘을 구현 하려다가 당연히 파이프를 구현할 때가 왔습니다. 좀 더 구체적으로 말하자면, 배관은 대부분의 경우 작동하지만, 마지막 인자는 없어집니다. 예를 들어 내가 명령을 실행할 경우커스텀 리눅스 쉘에서 파이핑하기
ps ax | grep ps
grep 명령이 ps에서 삭제 된 후 내 셸에 ps가 삭제되었습니다. 그래서 그 대신 당신의 전형적인 리눅스 쉘
339 ? S 0:00 upstart-udev-bridge --daemon
497 ? Ss 0:00 /usr/sbin/cupsd -F
503 ? S< 0:00 [kpsmoused]
720 ? S 0:00 upstart-socket-bridge --daemon
5541 pts/0 R+ 0:00 ps ax
5542 pts/0 S+ 0:00 grep --colour=auto ps
를 사용하여 그림과 같이이 출력의 당신은 당신이 일치하는 패턴 PS 검색하지 않는이 경우이
339 ? S 0:00 upstart-udev-bridge --daemon
497 ? Ss 0:00 /usr/sbin/cupsd -F
503 ? S< 0:00 [kpsmoused]
720 ? S 0:00 upstart-socket-bridge --daemon
5557 pts/0 R+ 0:00 ps ax
를 얻을.
내가 파이프 후 모든 변수는 인수의 두 번째 세트에서 여전히 있는지 확인했습니다
void mypipes(char* args[], int nargs)
{
pid_t pid;
int fd[2];
char* cmdargs[nargs - 2];
char* cmdargs2[nargs - 2];
int i;
int t = 0;
int count = 0;
for(i = 0; i < nargs; i++)
{
if(!strcmp(args[i], "|"))
{
//dont put into array
t = 1;
}
else if(t == 0)
{
cmdargs[i] = args[i];
count++;
}
else if(t == 1)
{
cmdargs2[i - 3] = args[i];
}
}
if(count == 2)
{
pipe(fd);
pid = fork();
if(pid == -1)
{
perror("unable to fork");
exit(1);
}
if(pid > 0)
{
wait(&pid);
close(fd[1]);
close(0);
dup2(fd[0],0);
execlp(cmdargs2[0], cmdargs2[0], cmdargs2[1], NULL);
}
if(pid == 0)
{
close(fd[0]);
close(1);
dup2(fd[1],1);
execlp(cmdargs[0], cmdargs[0], cmdargs[1], NULL);
}
}
if(count == 1)
{
pipe(fd);
pid = fork();
if(pid == -1)
{
perror("unable to fork");
exit(1);
}
if(pid > 0)
{
wait(&pid);
close(fd[1]);
close(0);
dup2(fd[0],0);
execlp(cmdargs2[0], cmdargs2[1], NULL);
}
if(pid == 0)
{
close(fd[0]);
close(1);
dup2(fd[1],1);
execlp(cmdargs[0], cmdargs[1], NULL);
}
}
}
을 다음 그들이 문제이기 때문에 배관 실행하는 기능을 메인 아니라 어딘가에서 실제 파이프를 끝까지 읽지 않습니다.
여기에 잘못된 정보가 있으면 언제든지 알려 주셔서 감사합니다.