Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- //pipe
- #include <sys/types.h>
- #include <fcntl.h>
- //signal
- #include <signal.h>
- int main(){
- char str[1024];//입력받은 문자열
- char *text1=NULL;
- char *text2=NULL;
- char *command1[4];//앞쪽명령어
- char *command2[5];//뒤쪽명령어
- int i ;
- char *pch;//문장나눌때 임시 저장
- //pipe
- int fd[2]; // 파이프 처리
- int fdr;// '>', '<'
- pid_t pid;
- //signal
- sigset_t blockset;// 막아놓을 시그널 목록
- sigemptyset(&blockset);
- sigaddset(&blockset, SIGINT);//목록에 해당 ^C시그널 추가
- sigaddset(&blockset, SIGQUIT);//^\시그널 추가
- sigprocmask(SIG_BLOCK, &blockset, NULL);
- while(1){
- for(i=0 ; i < 1024 ; i++){
- str[i]='\0';
- }
- command1[0]=NULL;command1[1]=NULL;command1[2]=NULL;command1[3]=NULL;
- command2[0]=NULL;command2[1]=NULL;command2[2]=NULL;
- printf("$");
- fgets(str,sizeof(str),stdin);
- if (feof(stdin)){
- printf("Ctrl+D exit \n");
- exit(0);
- }
- str[strlen(str)-1] ='\0';
- fflush( stdin );
- if(strchr(str,'|')!=NULL){//파이프 사용하는 경우
- text1 = strtok (str,"|");
- text2 = strtok (NULL, "|");
- //printf("cmd1 :%s\n cmd2 :%s\n",text1,text2);
- strcat(text1,"\0");
- strcat(text2, "\0");
- i=0;//초기화
- pch = strtok (text1," ");
- while (pch != NULL && i<3)
- {
- command1[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command1[%d]:%s\n",i,command1[i]);
- i++;
- }
- command1[i]=(char*)0;
- i=0;//초기화
- pch = strtok (text2," ");
- while (pch != NULL && i<3)
- {
- command2[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command2[%d]:%s\n",i,command2[i]);
- i++;
- }
- command2[i]=(char*)0;
- if(pipe(fd) == -1){//파이프 생성 fd[0] 읽기용, fd[1] 쓰기용
- printf("fail to call pipe()\n");
- exit(1);
- }
- switch(fork())//앞쪽 명령어프로세스 생성
- {
- case -1 : perror("fork error"); break;
- case 0 :
- if(close(1)==-1) perror("close1");
- if(dup(fd[1]) != 0);//표준출력 파이프 연결
- if(close(fd[0]) == -1 || close(fd[1]) == -1){
- perror("close2");
- }
- execvp(command1[0], command1);
- printf("command not found \n");
- exit(0);
- }
- switch(fork())//뒤쪽명령어 프로세스 생성
- {
- case -1 : perror ("fork"); break;
- case 0 :
- if(close(0) == -1) perror("close3");
- if(dup(fd[0]) != 0);//표준입력 파이프 연결
- if(close(fd[0]) == -1 || close(fd[1]) == -1) perror("close4");
- execvp(command2[0], command2);
- printf("command not found \n");
- exit(0);
- }
- if(close(fd[0]) == -1 || close(fd[1]) == -1) perror("close5");
- while(wait(NULL) != -1);
- }else if(strchr(str,'>')!=NULL){// '>'사용된 경우
- text1 = strtok (str,">");
- text2 = strtok (NULL, ">");
- i=0;//초기화
- pch = strtok (text1," ");
- while (pch != NULL && i<3)
- {
- command1[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command1[%d]:%s\n",i,command1[i]);
- i++;
- }
- command1[i]=(char*)0;
- i=0;//초기화
- pch = strtok (text2," ");
- while (pch != NULL && i<3)
- {
- command2[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command2[%d]:%s\n",i,command2[i]);
- i++;
- }
- command2[i]=(char*)0;
- switch(fork())//앞쪽명령어 프로세스 생성, 뒤쪽 파일 생성
- {
- case -1 : perror ("fork"); break;
- case 0 :
- fdr = open(command2[0], O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if(fdr==-1) {
- perror("파일 새로생성 오류");exit(1);
- }
- if( dup2(fdr, 1) == -1){
- perror("fdr dup error");
- }
- close(fdr);
- execvp(command1[0], command1);
- printf("command not found \n");
- exit(0);
- break;
- default : wait(NULL);
- }
- }else if(strchr(str,'<')!=NULL){// '<' 사용된 경우
- text1 = strtok (str,"<");
- text2 = strtok (NULL, "<");
- i=0;//초기화
- pch = strtok (text1," ");
- while (pch != NULL && i<3)
- {
- command1[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command1[%d]:%s\n",i,command1[i]);
- i++;
- }
- command1[i]=(char*)0;
- i=0;//초기화
- pch = strtok (text2," ");
- while (pch != NULL && i<3)
- {
- command2[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command2[%d]:%s\n",i,command2[i]);
- i++;
- }
- command2[i]=(char*)0;
- switch(fork())//앞쪽 파일 생성,뒤쪽 프로세스 생성
- {
- case -1 : perror ("fork"); break;
- case 0 :
- fdr = open(command1[0], O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if(fdr==-1) {
- perror("파일 새로생성 오류");exit(1);
- }
- if( dup2(fdr, 1) == -1){
- perror("fdr dup error");
- }
- close(fdr);
- execvp(command2[0], command2);
- printf("command not found \n");
- exit(0);
- break;
- default : wait(NULL);
- }
- }else{ //단일 명령문
- str[strlen(str)]='\0';
- //printf("onlycmd1:%s \n",str);
- i=0;//초기화
- pch = strtok (str," ");
- while (pch != NULL && i<3)
- {
- command1[i]=pch;
- pch = strtok (NULL, " ");
- //printf ("command1[%d]:%s\n",i,command1[i]);
- i++;
- }
- command1[i]=(char*)0;
- //printf ("command1[0]:%s\n",command1[0]);
- if(command1[0]!=NULL){
- if(strcmp(command1[0],"logout")==0){//명령어 logout
- exit(0);
- }else if(strcmp(command1[0],"cd")==0){//내장명령어 cd
- chdir(command1[1]);//현재 디렉토리 변경
- }else if(fork()==0){
- execvp(command1[0], command1);
- printf("command not found \n");
- exit(0);
- }
- wait(NULL);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement