gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:58 35 4
gpt4 key购买 nike

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

最佳答案

这并不“奇怪”。

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

关于c - 为什么我的 shell 在终止进程后打印不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444205/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com