>> Edit article
이름
제목
패스워드
학교 숙제로 멀티플렉서를 만들어야 하는데 넘 어려워용... 우선 저번까지 숙제로 만든 쉘이 있습니다... 실제 물리적인 터미널위에서 멀티플렉서가 돌면서... 필요한 만큰 쉘 프로세스를 포크합니다.. forkpty()시스템 콜로 쉘 프로세스는 포크하면서 하나의 pseudo terminal을 가지도록 합니다.. 수도터미널을 가진 여러 쉘 프로세스중 하나에게 명령어를 보냅니다.. 그러면 그 선택된 하나의 쉘에서 실행된 결과가 수도터미널의 마스터를 거쳐서 멀티플렉서가 읽은 다음에 실제 물리적인 터미널에 출력해주는 것입니다.. 막히는 부분이 쉘 프로세스에게 명령을 전달하는 것입니다.. bash에선 "echo ls | bash"하면 ls의 결과가 나옵니다.. 저도 멀티플렉서와 쉘 프로세스 사이에 파이프를 만들어서 전달을 했는데 안되네요... 다음은 쉘프로세스를 forkpty()로 수도터미널로 포크하고 파이프로 명령어를 전송하고 결과를 읽어서 출력하는 것인데... execlp("ls", "ls");해서 하면 잘되거든요... ls 결과가 멀티플렉서를 거쳐서 잘 나오는데... 제 한계입니다.. 아시는 분 도움 좀 주세요.. T.T #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <pty.h> #include <utmp.h> #include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { int master; char slave[200]; pid_t child; fd_set rfds; struct timeval tv; int retval; char buf[4096]; char argv[2][4] = {"ls", "-al"}; int fd, pvc; tv.tv_sec = 5; tv.tv_usec = 0; child = forkpty(&master, slave, NULL, NULL); fprintf(stderr, "%s", slave); mkfifo("./pvc", 0660); pvc = open("./pvc", O_RDWR); if(child == 0) { dup2(pvc, STDIN_FILENO); execl("./nssh", "nssh"); fprintf(stderr, "%s", strerror(errno)); exit(-1); } else { write(pvc, "ls", strlen("ls") * sizeof(char)); FD_ZERO(&rfds); FD_SET(master, &rfds); retval = select(master + 1, &rfds, NULL, NULL, &tv); if(FD_ISSET(master, &rfds)) { fprintf(stderr, "ready"); while( read(master, buf, sizeof(buf)) > 0 ) fputs(buf, stdout); } } exit(1); }
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved