コード例 #1
0
ファイル: asg2-shell.c プロジェクト: m-Just/Courses
int main(int argc,char* argv[])
{
  signal(SIGINT, sig_handler);
  signal(SIGTERM, sig_handler);
  signal(SIGQUIT, sig_handler);
  signal(SIGTSTP, sig_handler);
  int isExit = 0;
  do {
    char rawInput[255];
    isExit = getUserInput(rawInput);
    if(isExit == 1) break;
    
    if (isExit == 0)
      tokenizeInput(rawInput);

  } while(isExit = 1);
  return 0;
}
コード例 #2
0
ファイル: main.c プロジェクト: walshycakes/cs4414
int main(int argc, char** argv) {
	pid_t pid;
	glob_t globbuf;

	while (1) {
		printf("$");

		char buf[MAX_LINE];
		char **argvv = tokenizeInput(buf);

		if (strcmp(argvv[0], "exit") == 0) {
			kill(pid, SIGKILL);
			exit(1);
		}

		pid = fork();

		if (pid < 0) {
			fprintf(stderr, "Fork failed");
			exit(1);
		}
		else if (pid == 0) { // child
			// backup stdout, stdin
			int stdin_save, stdout_save;

			
			// exec, redirecting streams as necessary
			if (is_redirect_in) {
				stdin_save = dup(STDIN_FILENO);
				freopen(redirect_stream, "r", stdin);
				execvp(argvv[0], argvv);
				dup2(stdin_save, STDIN_FILENO);
				exit(1);
			}
			else if (is_redirect_out) {
				stdout_save = dup(STDOUT_FILENO);
				freopen(redirect_stream, "w", stdout);
				execvp(argvv[0], argvv);
				dup2(stdout_save, STDOUT_FILENO);
				exit(1);
			}
			else if (has_wildcard) {
				// usage as detailed in `man glob`
				globbuf.gl_offs = argv_count - 1;

				// the GLOB_DOOFFS allocates gl_offs for us to merge
				glob(wildcard_expr, GLOB_DOOFFS, NULL, &globbuf);
				
				// merge the existing argvv array
				int i;
				for (i = 0; i < argv_count - 1; ++i) {
					globbuf.gl_pathv[i] = argvv[i];
				}
				execvp(argvv[0], globbuf.gl_pathv);
				exit(1);
			}
			else {
				execvp(argvv[0], argvv);
				exit(1);
			}
		}
		else { // parent
			if (is_fg) {
				wait(NULL);
			}
		}
	}
	
	return 0;
}