У меня есть программа, которая, кажется, висит в родительском процессе. Это макетная программа bash, которая принимает команды типа bash, а затем управляет ими. Код ниже. (Обратите внимание упрощена код без проверки, так что это будет более легко читаемым ошибка. Предположим, его все правильно вложены внутри основной функции)Процесс зависает в родительском процессе в C
#define MAX_LINE 80
char *args[MAX_LINE/2 + 1];
while(should_run){
char *inputLine = malloc(MAX_LINE);
runConcurrently = 0; /*Resets the run in background to be line specific */
fprintf(stdout, "osh> "); /*Command prompt austhetic */
fflush(stdout);
/*User Input */
fgets(inputLine, MAX_LINE, stdin);
/*Reads into Args array */
char *token = strtok(inputLine, " \n");
int spot = 0;
while (token){
args[spot] = token;
token = strtok(NULL, " \n");
spot++;
}
args[spot] = NULL;
/* checks for & and changes flag */
if (strcmp(args[spot-1], "&") == 0){
runConcurrently = 1;
args[spot-1] = NULL;
}
/* Child-Parent Fork Process */
pid_t pid;
pid = fork(); /*Creates the fork */
if (pid == 0){
int run = execvp(args[0], args);
if (run < 0){
fprintf(stdout, "Commands Failed, check syntax!\n");
exit(1);
}
}
else if (pid > 0) {
if (!runConcurrently){
wait(NULL);
}
}
else {
fprintf(stderr, "Fork Failed \n");
return 1;
}
}
Проблема здесь связана с тем, когда я использую «&» и активировать запустить флажок одновременно. Это делает так, чтобы родитель больше не должен был ждать, однако, когда я это делаю, я теряю некоторые функции.
Ожидаемый результат:
osh> ls-a &
//Outputs a list of all in current directory
osh>
Так что я хочу, чтобы запустить их concurently, но передать управление терминалом обратно ко мне. Но вместо этого я получаю это.
Фактический результат:
osh> ls -a &
//Outputs a list of all in current directory
<---- Starts a new line without the osh>. And stays like this indefinitely
И если я что-то типа в эту пустую область результат:
osh> ls -a &
//Outputs a list of all in current directory
ls -a
//Outputs a list of all in current directory
osh> osh> //I get two osh>'s this time.
Это мой первый раз, работая с разделенными процессами и вилкой(). Я что-то упустил? Когда я запускаю его одновременно, я должен выбирать процессы или что-то в этом роде? Любая помощь приветствуется, спасибо!
если добавить '\ n' к быстрой линии, она работает, как ожидалось? –