From c97a162e8c60aa20a1de02cd828db8f35bd53085 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Wed, 12 Aug 2026 14:06:28 +0000 Subject: bg/fg --- tsh.cc | 35 +++++++++++++++++++++++++++++++++++ util.h | 5 +++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tsh.cc b/tsh.cc index f6027ae..985c083 100644 --- a/tsh.cc +++ b/tsh.cc @@ -96,6 +96,8 @@ handler_t *Signal(int signum, handler_t *handler); // built-in commands void builtin_command_quit(); +inline int block_all(sigset_t *prev); + vector builtin_cmd_list = {"quit", "fg", "bg", "jobs"}; /* @@ -194,6 +196,9 @@ void eval(char *cmdline) cout << "built-in" << endl; if (strcmp(argv[0], "quit") == 0) builtin_command_quit(); else if (strcmp(argv[0], "jobs") == 0) listjobs(jobs); + else if (strcmp(argv[0], "fg") == 0) do_bgfg(argv); + else if (strcmp(argv[0], "bg") == 0) do_bgfg(argv); + else cerr << "built-in but not supported" << endl; return; } @@ -327,6 +332,29 @@ int builtin_cmd(char *c_str) */ void do_bgfg(char **argv) { + if (strcmp(argv[0], "fg") == 0) + { + LOG << "fg" << endl; + int jid = atoi(argv[1]); + sigset_t prev; + block_all(&prev); + job_t *j = getjobjid(jobs, jid); + j->state = FG; + kill(-(j->pid), SIGCONT); + sigprocmask(SIG_SETMASK, &prev, NULL); + waitfg(j->pid); + } else if (strcmp(argv[0], "bg") == 0) + { + LOG << "bg" << endl; + int jid = atoi(argv[1]); + sigset_t prev; + block_all(&prev); + job_t *j = getjobjid(jobs, jid); + j->state = BG; + kill(-(j->pid), SIGCONT); + sigprocmask(SIG_SETMASK, &prev, NULL); + } else + cerr << "not fg/bg" << endl; return; } @@ -655,3 +683,10 @@ bool job_suspend(struct job_t *jobs, pid_t pid) { } return false; } + +inline int block_all(sigset_t *prev) +{ + sigset_t set; + sigfillset(&set); + return sigprocmask(SIG_SETMASK, &set, prev); +} diff --git a/util.h b/util.h index 9d939f9..072f65e 100644 --- a/util.h +++ b/util.h @@ -22,8 +22,9 @@ void atomic_print(int x); void reverse(char str[], int length); char* itoa(int num, char* str, int base); -constexpr bool GLOBAL_DEBUG = false; -bool DEBUG = false; // verbose mode +constexpr bool GLOBAL_DEBUG = true; +bool DEBUG = true; // verbose mode, can be enabled on demand using something like -v +struct LogVoidify { void operator&(std::ostream&) const {} }; const int DECIMAL = 10; const int LENGTH = 20; -- cgit v1.3.1-4-g156e