OS/Homework
[운영체제] 쉘 프로그래밍
달의요정루나
2022. 6. 27. 10:57
1. 다음 프로그램을 참고하여 쉘을 작성하시오.
#include <stdio.h>
#include <unistd.h>
char * get_next_command(void);
int main(int argc, char* argv[])
{
while(1){
char *cmd = get_next_command();
int child_pid = fork();
if(child_pid == 0){
exec(cmd);
panic("exec failed!");
}
else{
wait(child_pid);
}
}
}
[Hint] exec 관련 함수
#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *) */ );
int execv(const char *pathname, char *const argv[0]);
int execle(const char *pathname, const char *arg0, ... /* (char *)0, char *const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */);
int execvp(const char *filename, char *const argv[]);
<소스 코드>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#define MAX 64
void * get_next_command(char buf[]);
int main(int argc, char* argv[])
{
char buf[MAX];
while(get_next_command(buf)){
int child_pid = fork();
if(child_pid <0){
perror("error\n");
return -1;
}
else if(child_pid == 0){
execlp(buf,buf,NULL);
exit(0);
}
else{
wait(NULL);
}
}
return 0;
}
void * get_next_command(char buf[])
{
printf("Shell > ");
fgets(buf,MAX-1,stdin);
buf[strlen(buf)-1]='\0';
}
2. background 실행이 지원되도록 위의 쉘 프로그램을 개선하시오.
실행 예) $ls, ls&
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#define MAX 64
void * get_next_command(char buf[]);
int main(int argc, char* argv[])
{
char buf[MAX];
char *args[MAX];
int i=0;
while(get_next_command(buf)){
args[i]=strtok(buf," ");
while(args[i]!=NULL){
i++;
args[i]=strtok(NULL," ");
}
if(strcmp(args[i-1],"&")==0){
args[i-1]=NULL;
}
int child_pid = fork();
if(child_pid <0){
perror("error\n");
return -1;
}
else if(child_pid == 0){
execlp(buf,buf,NULL);
exit(0);
}
else{
wait(NULL);
}
}
return 0;
}
void * get_next_command(char buf[])
{
printf("Shell > ");
fgets(buf,MAX-1,stdin);
buf[strlen(buf)-1]='\0';
}