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';
}