我正在做'&'时进行后台处理结束了。我认为它工作正常,但出于某种原因,在杀死进程后执行任何命令后,“Ben $”打印奇怪,我无法弄清楚原因。
这就是它的印刷品:
Ben$ ls
Makefile shell2 shell2.c stableshell2.c
Ben$ sleep 20 &
Ben: started job 30892
Ben$ kill 30892
Ben$ ls
Ben$ Makefile shell2 shell2.c stableshell2.c
ls
Ben$ Makefile shell2 shell2.c stableshell2.c
有什么想法吗?
/*
Shell 1
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdbool.h>
#define DELIMS " \t\r\n"
int main (int argc, char *argv[]) {
while (1) {
char line[100];
char *temp;
char *split[15];
int pid;
bool background=false;
printf("Ben$ ");
//if cmd-d, exit shell
if(!fgets(line, sizeof(line), stdin)) {
printf("\n");
break;
}
line[strlen(line)-1]='\0';
temp=strtok(line," ");
if (strcmp(temp, "exit") == 0) {
break;
}
else if (strcmp(temp, "cd") == 0) {
char *arg = strtok(0, DELIMS);
if (!arg) {
fprintf(stderr, "cd missing argument.\n");
}
else {
chdir(arg);
}
} else {
int i=0;
while(temp != NULL) {
split[i]=temp;
temp=strtok(NULL," ");
i++;
}
split[i] = NULL;
if(strcmp(split[i-1], "&")==0) {
// printf("should do in background");
split[i-1]='\0';
background=true;
}
char *args[i];
int j;
for(j=0; j < i; j++){
args[j]=split[j];
}
pid=fork();
if(pid==0) {
if(background) {
fclose(stdin);
fopen("/dev/null","r");
}
execvp(args[0], args);
printf("This should not happen\n");
}
else {
if(!background) {
// printf("Not in background\n");
wait(&pid);
}
else {
printf("Ben: started job %d\n",pid);
}
}
}
}
return 0;
}
答案 0 :(得分:1)
那不是“奇怪”。
您正在异步调用进程,因此您可以在控制台中交叉输出它们的输出。