diff options
| author | _ov4 <ov4@ov4.org> | 2026-08-13 11:03:16 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-08-13 11:03:16 +0000 |
| commit | ddbd21e8804071e794fb1264d2cfa095971870c5 (patch) | |
| tree | d11a4831ee3f4ffb7efbea1131b5724d25bd90d4 /tsh.cc | |
| parent | c97a162e8c60aa20a1de02cd828db8f35bd53085 (diff) | |
bg/fg
Diffstat (limited to 'tsh.cc')
| -rw-r--r-- | tsh.cc | 48 |
1 files changed, 28 insertions, 20 deletions
@@ -332,30 +332,38 @@ int builtin_cmd(char *c_str) */ void do_bgfg(char **argv) { - if (strcmp(argv[0], "fg") == 0) + if ((strcmp(argv[0], "fg") == 0) || (strcmp(argv[0], "bg") == 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]); + int x; + job_t *j = nullptr; sigset_t prev; + if (argv[1][0] == '%') // jid provided + { + x = atoi(argv[1]); // eat % + j = getjobjid(jobs, x); + } else { // pid + x = atoi(argv[0]); + j = getjobpid(jobs, x); + } + block_all(&prev); - job_t *j = getjobjid(jobs, jid); - j->state = BG; - kill(-(j->pid), SIGCONT); - sigprocmask(SIG_SETMASK, &prev, NULL); - } else + if (strcmp(argv[0], "fg") == 0) // fg + { + LOG << "fg" << endl; + j->state = FG; + kill(-(j->pid), SIGCONT); + sigprocmask(SIG_SETMASK, &prev, NULL); + waitfg(j->pid); + } else // bg + { + LOG << "bg" << endl; + j->state = BG; + kill(-(j->pid), SIGCONT); + sigprocmask(SIG_SETMASK, &prev, NULL); + } + } + else cerr << "not fg/bg" << endl; - return; } /* |
