Skip to main content
 首页 » 编程设计

c之为什么我的 shell 在终止进程后打印不正确

2023年11月22日23exmyth

当“&”结束时,我正在进行后台处理。我认为它工作正常,但出于某种原因,在终止进程后执行任何命令后,“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; 
} 

请您参考如下方法:

这并不“奇怪”。

您正在异步调用进程,因此您可以在控制台中交错输出它们。