Shell Lab: trace09-10
This commit is contained in:
parent
ab00d9b9ce
commit
df26291a85
60
shlab/tsh.c
60
shlab/tsh.c
|
@ -281,7 +281,12 @@ int builtin_cmd(char **argv)
|
|||
listjobs(jobs);
|
||||
return 1; // this IS a builtin command, return 1 to notify
|
||||
}
|
||||
return 0; /* not a builtin command */
|
||||
if (strcmp(argv[0], "bg") == 0 || strcmp(argv[0], "fg") == 0) // judge bg & fg
|
||||
{
|
||||
do_bgfg(argv);
|
||||
return 1;
|
||||
}
|
||||
return 0; /* not a builtin command */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -289,6 +294,59 @@ int builtin_cmd(char **argv)
|
|||
*/
|
||||
void do_bgfg(char **argv)
|
||||
{
|
||||
char *id = argv[1], *end; // JID or PID
|
||||
struct job_t *job;
|
||||
int numid;
|
||||
// extract job or process
|
||||
if (id == NULL) // not specified
|
||||
{
|
||||
printf("%s command requires PID or %%jobid argument\n", argv[0]);
|
||||
return;
|
||||
}
|
||||
if (id[0] == '%') // this is a job
|
||||
{
|
||||
id++; // point to the number position
|
||||
numid = strtol(id, &end, 10); // convert id char[] to integer
|
||||
if (*end != '\0') // contains non-digit numbers
|
||||
{
|
||||
printf("%s: argument must be a PID or %%jobid\n", argv[0]);
|
||||
return;
|
||||
}
|
||||
job = getjobjid(jobs, numid); // try to get job
|
||||
if (job == NULL)
|
||||
{
|
||||
printf("%%%d: No such job\n", numid);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else // this is a process
|
||||
{
|
||||
numid = strtol(id, &end, 10);
|
||||
if (*end != '\0')
|
||||
{
|
||||
printf("%s: argument must be a PID or %%jobid\n", argv[0]);
|
||||
return;
|
||||
}
|
||||
job = getjobpid(jobs, numid); // try to get proc
|
||||
if (job == NULL)
|
||||
{
|
||||
printf("(%d): No such process\n", atoi(id));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// send signal
|
||||
kill(-(job->pid), SIGCONT);
|
||||
// process according to bg/fg
|
||||
if (strcmp(argv[0], "fg") == 0) // foreground
|
||||
{
|
||||
job->state = FG;
|
||||
waitfg(job->pid);
|
||||
}
|
||||
else // background
|
||||
{
|
||||
job->state = BG;
|
||||
printf("[%d] (%d) %s", job->jid, job->pid, job->cmdline);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue