自分の手作りシェルを実装するのに少し問題があります。プロセスをフォークして、waitpidを使用してフォアグラウンドで実行することはできましたが、「sleep 5&」などの単純なプロセスをバックグラウンドで実行しようとすると、プロセスが永久に実行されるように見えます。checkListJobsは、プロセスの実行が完了したかどうかを判断しますが、停止することはありません。どんな助けでも大歓迎です。エラーは私の「foo」関数にあると思います。
void insertJob(int pid) {
printf("beginning job %d.\n", pid);
struct job *node = malloc(sizeof(struct job));
node->pid = pid;
node->next = NULL;
if(root == NULL) {
root = node;
} else {
node->next = root;
root = node;
}
}
void checkListJobs(int z) {
curr = root;
while(curr!=NULL) {
if(kill(curr->pid,0) != 0) {
if(prev==NULL) {
prev = curr;
root = curr;
} else {
prev->next = curr->next;
}
} else {
if(!z) printf("%d is still running.\n", curr->pid);
}
prev = curr;
curr = curr->next;
}
}
//code for child forking
void foo(char *cmd, char *argv[], int args) {
int bgFlag;
if(!strcmp(argv[args], "&")){
argv[args] = '\0';
bgFlag = 1;
}
int pid = fork();
int status = 0;
if(pid==0){
if(bgFlag) {
fclose(stdin); // close child's stdin
fopen("/dev/null", "r"); // open a new stdin that is always empty
}
execvp(cmd, argv);
// this should never be reached, unless there is an error
fprintf (stderr, "unknown command: %s\n", cmd);
exit(0);
} else {
if(!bgFlag) {
waitpid(pid, &status, 0);
} else {
insertJob(pid);
}
if (status != 0) {
fprintf (stderr, "error: %s exited with status code %d\n", cmd, status);
} else {
// cmd exec'd successfully
}
}
// this is the parent still, since the child always terminates from exec or exit
// continue being a shell...
}