#include #include #include #include #include void File_Input(int option, char *com[5], int background); void File_Output(int option, char *com[5], int background); void Pipe(char *com[5], int background); void Round_robin(int robin, char *com[5], int background); char buf[256]; int main(int argc, char* argv[]) { char blank[] = " "; int status; int i = 0, in, out, back, pipe, robin ; char *token; char *com[5]; while(1) { for(i = 0; i <256; i++) buf[i] = '\0'; //ÃʱâÈ­ for(i = 0; i <5; i++) com[i] = '\0'; //ÃʱâÈ­ in = 0; out = 0; back = 0; pipe = 0; robin = 0; // º¯¼ö ÃʱâÈ­ // Ç¥ÁØÀÔ·ÂÀåÄ¡¿¡ ÇÁ·ÒÇÁÆ® Ç¥½Ã write(1, "[MySHELL]$ ", 11); // ^D ȤÀº logoutÀԷ½à shellÁ¾·á if(read(0, buf, 256) == 0 || strcmp(buf, "logout\n") == 0) break; // °ø¹é¶óÀÎ continue; else if(strlen(buf)<1) continue; buf[strlen(buf) - 1] = '\0'; for(i = 0; i ') { in++; //'>'ÀÇ °¹¼ö Ä«¿îÅÍÁõ°¡ buf[i] = ' '; } // ¸í·É¾î¿¡ ÀԷ¹æÇâÀüȯ ±âÈ£ ÀÖÀ»¶§ else if(buf[i] == '<') { out++; // '<'ÀÇ °¹¼ö Ä«¿îÅÍ Áõ°¡ buf[i] = ' '; } // ¸í·É¾î¿¡ ¹é±×¶ó¿îµå ½ÇÇà ±âÈ£°¡ ÀÖÀ»¶§ if(buf[i] == '&') { back++; // '&'ÀÇ °¹¼ö Ä«¿îÅÍ Áõ°¡ buf[i] = ' '; } if(buf[i] == '|') { pipe++; // '|'ÀÇ °¹¼ö Ä«¿îÅÍ Áõ°¡ buf[i] = ' '; } if(buf[i] == ';') { robin++; buf[i] = ' '; } // ÀԷ¹æÇâÀüȯ°ú Ãâ·Â¹æÇâÀüȯÀÌ °°ÀÌ ÀԷµǾúÀ»¶§ Error if(in != 0 &&out != 0) { write(1, "Error!!\n", 8); continue; } // blank·Î ¸í·É¾î¸¦ ºÐÇÒ token = strtok(buf, blank); i = 0; //¸í·É¾î À妽º while(token != NULL) { com[i] = token; // ¸í·É¾î¸¦ ºÐÇÒÇؼ­ com[i]¿¡ ³ÖÀ½ token = strtok(NULL, blank); i++; } if(in != 0) { File_Input(in, com, back); continue; } else if(out != 0) // ¸í·É¿¡¼­ ÀԷ¹æÇâÀüȯ ±âÈ£°¡ ÀÖÀ»°æ¿ì { File_Output(out, com, back); continue; } else if(pipe !=0) { Pipe(com, back); continue; } else if(robin !=0) { Round_robin(robin, com, back); continue; } else { if(fork() == 0) //¸í·É¾î ½ÇÇàÀ» À§ÇÑ ÀÚ½Ä ÇÁ·Î¼¼½º »ý¼º { execlp(com[0], buf, com[1], com[2], com[3], com[4], NULL); //ÀÔ·ÂÇÑ ¸í·É ½ÇÇà exit(0); } if(back == 0) wait(&status); // ¹é±×¶ó¿îµå°¡ ¾Æ´Ï¸é ºÎ¸ðÇÁ·Î¼¼¼­°¡ ÀÚ½ÄÇÁ·Î¼¼½º Á¾·áÇϱ⸦ ±â´Ù¸² // ¸í·É¾î¿¡ ¹é±×¶ó¿îµå ±âÈ£°¡ ÀÖÀ»°æ¿ì wait()¸¦ µÎÁö¾Ê¿¡ ¹é±×¶ó¿îµå·Î ½ÇÇà } } return 0; } void File_Input(int option, char *com[5], int background) // Ãâ·Â¹æÇâÀüȯ(¹æÇâÀüȯ±âÈ£°¹¼ö, ¸í·É¾î, º¤±×¶ó¿îµåÀ¯¹«) { int monitor, status, i = 0; monitor = dup(1); // Ç¥ÁØÃâ·ÂÀåÄ¡¸¦ ³ªÁß¿¡ ´Ù½Ã ¿­¾îÁÖ±â À§ÇØ Ç¥ÁØÃâ·ÂÀåÄ¡¸¦ monitorº¯¼ö¿¡ Àӽ÷Π³Ö¾îµÒ close(1) ; for(i = 0; com[i] != NULL; i++); // ¸í·É¾î°¡ ¸î°³·Î ±¸ºÐµÇ¾ú´ÂÁö Ä«¿îÅÍ => ÆÄÀϸí ÃßÃâ À§ÇØ switch(option) // ¹æÇâÀüȯ ±âÈ£¿¡ µû¶ó °»½ÅÇÒÁö Ãß°¡ÇÒÁö °áÁ¤ { case 1: // ¾øÀ¸¸é »õ·Î »ý¼ºÇÏ°í, ÀÖÀ¸¸é ±âÁ¸ÀÇ ÀÖ´ø°É »èÁ¦ÇÏ°í ¾²±âÀü¿ëÀ¸·Î »õ·Î¸¸µë open(com[i-1], O_WRONLY | O_CREAT | O_TRUNC); break; case 2: // ¾øÀ¸¸é »õ·Î »ý¼ºÇÏ°í, ÀÖÀ¸¸é ±× ³»¿ë¿¡ »õ·Î¿î ³»¿ëÀ» Ãß°¡ open(com[i-1], O_WRONLY | O_CREAT | O_APPEND); break; } com[i-1] = '\0'; //ÆÄÀϸíÀ» Áö¿öÁÜ if(fork() == 0) // ÀÚ½ÄÇÁ·Î¼¼¼­¸¦ »ý¼ºÇØ ¸í·É¾î ½ÇÇà { execlp(com[0], buf, com[1], com[2], com[3], com[4], NULL); exit(0); } if(background == 0) wait(&status); close(1); // ¿­¸° ÆÄÀÏÀ» ´ÝÀ½ dup(monitor); // Ç¥ÁØÃâ·ÂÀåÄ¡¸¦ ´Ù½Ã ¿­¾îÁÜ } void File_Output(int option, char *com[5], int background) { int i, keyboard, status; keyboard = dup(0); // ³ªÁß¿¡ Ç¥ÁØÀÔ·ÂÀåÄ¡¸¦ ´Ù½Ã ¿­¾îÁÖ±âÀ§ÇØ Ç¥ÁØÀÔ·ÂÀåÄ¡¸¦ keyboardº¯¼ö¿¡ Àӽ÷ÎÀúÀå close(0); // Ç¥ÁØÃâ·ÂÀåÄ¡¸¦ ´Ý¾ÆÁÜ for(i = 0; com[i] != NULL; i++); // ¸í·É¾î°¡ ¸î°³·Î ±¸ºÐµÇ¾ú´ÂÁö Ä«¿îÅÍ => ÆÄÀϸí ÃßÃâ À§ÇØ open(com[i-1], O_RDONLY ); // ÆÄÀÏÀ» Àбâ Àü¿ëÀ¸·Î ¿° com[i-1] = '\0'; // ¸í·É¾î¿¡¼­ ÆÄÀϸíÀ» Áö¿öÁÜ if(fork() == 0) // ¸í·É¾î ½ÇÇàÀ» À§ÇÑ ÀÚ½Ä ÇÁ·Î¼¼¼­ »ý¼º { execlp(com[0], buf, com[1], com[2], com[3], com[4], NULL); exit(0); } if(background == 0) wait(&status); close(0); // ÆÄÀÏÀ» ´Ý¾ÆÁÜ dup(keyboard); } void Pipe(char *com[5], int background) // ÆÄÀÌÇÁ ±¸Çö { int fds[2]; if(pipe(fds) < 0) { // ÆÄÀÌÇÁ µð½ºÅ©¸³Å͸¦ ¾òÀ½ perror("pipe"); exit(0); } if(fork()==0){ close(1); // Ç¥ÁØÃâ·ÂÀ» ´Ý°í, dup(fds[1]); // dup¸¦ »ç¿ëÇØ ÆÄÀÌÇÁÀÇ ¾²±â µð½ºÅ©¸³ÅÍÀÎ fds[1]À» º¹»ç close(fds[0]); close(fds[1]); execlp(com[0], com[0], NULL); exit(0); } if(fork()==0){ close(0); // Ç¥ÁØÀÔ·ÂÀ» ´Ý°í, dup(fds[0]); // dup¸¦ »ç¿ëÇØ ÆÄÀÌÇÁÀÇ ¾²±â µð½ºÅ©¸³ÅÍÀÎ fds[0]À» º¹»ç close(fds[0]); close(fds[1]); execlp(com[1], com[1], NULL); exit(0); } close(fds[0]); close(fds[1]); while(wait(NULL)>0); } void Round_robin(int robin, char *com[5], int background) // ¼øÂ÷½ÇÇà ±¸Çö { int i, status; for(i = 0 ; i <= robin;i++) // ¹ÞÀº ¸í·É¾î ¸¸Å­ ¼øÂ÷ ½ÇÇà { if(fork() == 0) { execlp(com[i],com[i], NULL); //ÀÔ·ÂÇÑ ¸í·É ½ÇÇà exit(0); } if(background == 0) wait(&status); // ¸í·É¾î¿¡ ¹é±×¶ó¿îµå ±âÈ£°¡ ÀÖÀ»°æ¿ì wait()¸¦ µÎÁö¾Ê¿¡ ¹é±×¶ó¿îµå·Î ½ÇÇà // ¹é±×¶ó¿îµå°¡ ¾Æ´Ï¸é ºÎ¸ðÇÁ·Î¼¼¼­°¡ ÀÚ½ÄÇÁ·Î¼¼½º Á¾·áÇϱ⸦ ±â´Ù¸² } } }