Added do_bgfg
parent
118203244b
commit
f71dad3594
63
tsh.c
63
tsh.c
|
@ -280,55 +280,50 @@ int builtin_cmd(char **argv)
|
||||||
*/
|
*/
|
||||||
void do_bgfg(char **argv)
|
void do_bgfg(char **argv)
|
||||||
{
|
{
|
||||||
struct job_t *job_1;
|
struct job_t *job;
|
||||||
char *j = argv[1];
|
int jid;
|
||||||
int JID;
|
pid_t pid;
|
||||||
pid_t PID;
|
|
||||||
|
|
||||||
if(j==NULL){ // if no arg
|
// if arg empty
|
||||||
fprintf(stderr,"%s command requires PID or %%jobid argument\n",argv[0]);
|
if(argv[1]==NULL){
|
||||||
|
fprintf(stderr,"%s command requires pid or %%jobid argument\n",argv[0]);
|
||||||
return;
|
return;
|
||||||
}
|
} else if(argv[1][0] == '%') { // if looking for jid
|
||||||
|
jid = atoi(&argv[1][1]);
|
||||||
|
if(!jid){
|
||||||
else if(j[0] == '%'){ // case1 job id , ex) %5
|
printf("%s: argument must be a pid or %%jobid\n", argv[0]);
|
||||||
JID = atoi(&j[1]);
|
|
||||||
if(!JID){
|
|
||||||
printf("%s: argument must be a PID or %%jobid\n", argv[0]);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
job_1 = getjobjid(jobs, JID);
|
job = getjobjid(jobs, jid);
|
||||||
if(job_1 == NULL){ // if not existing job
|
if(job == NULL) {
|
||||||
printf("%s no such job\n", argv[1]);
|
printf("%s no such job\n", argv[1]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else { // if looking for pid
|
||||||
else{ // case2 process id, ex) 5
|
pid = atoi(argv[1]);
|
||||||
PID = atoi(j);
|
if(!pid){
|
||||||
if(!PID){
|
printf("%s: argument must be a pid or %%jobid\n", argv[0]);
|
||||||
printf("%s: argument must be a PID or %%jobid\n", argv[0]);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
job_1 = getjobpid(jobs, PID);
|
job = getjobpid(jobs, pid);
|
||||||
if(job_1 == NULL){ // if non existant proc
|
if(job == NULL){
|
||||||
printf("(%s) no such process\n", argv[1]);
|
printf("(%s) no such process\n", argv[1]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PID = job_1->pid;
|
if (job->state == ST) {
|
||||||
|
kill(-job->pid, SIGCONT); // continue process of the job
|
||||||
if(!strcmp("bg", argv[0])){ //background job
|
|
||||||
job_1->state = BG;
|
|
||||||
printf("[%d] (%d) %s", job_1->jid, job_1->pid, job_1->cmdline);
|
|
||||||
kill(-PID, SIGCONT);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else{ //foreground job
|
|
||||||
job_1->state = FG;
|
job->state = strcmp(argv[0], "fg") == 0 ? FG : BG; // set the state to the new state
|
||||||
kill(-PID, SIGCONT);
|
|
||||||
waitfg(job_1->pid);
|
if (job->state == FG) {
|
||||||
|
waitfg(job->pid); // if foreground, wait for the foreground job
|
||||||
|
} else {
|
||||||
|
printf("[%d] (%d) %s", job->jid, job->pid, job->cmdline);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +333,7 @@ void do_bgfg(char **argv)
|
||||||
void waitfg(pid_t pid)
|
void waitfg(pid_t pid)
|
||||||
{
|
{
|
||||||
while (pid == fgpid(jobs)) {
|
while (pid == fgpid(jobs)) {
|
||||||
sleep(1);
|
sleep(1); // busy loop
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue