У меня возникла проблема с зависанием процесса. Я искал эту проблему и ее единственную ошибку, которую я имею в настоящее время для моей программы оболочки.программа застряла в ожидании()
Проблема заключается в том, что программа должна выйти, когда пользователь вводит «выход». Однако кажется, что если пользователь вводит недопустимую строку, программа застревает в wait(). это приводит к необходимости дважды вводить exit для выхода вместо одного. Как остановить это, как я могу выйти из вызова wait(), когда пользователь вводит тупицу?
Шагов для воспроизведения:
- компилировать и запускать с GCC/G ++
- типа в ругательстве вашего выбора
- типа выход
- уведомления о выходе из программы оленьей кожи (потому что его застряли на ожиданиях(), но подсказка
- тип выход снова
- программные выходы
#include <iostream>
#include <unistd.h>
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <string>
#include <sys/wait.h>
#include <sstream>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
using std::string;
using std::cout;
using std::endl;
bool exitstatus;
int argsIndex = 0;
pid_t pid;
int main(void)
{
char * args[100];
string check = "";
while(exitstatus==false)
{
cout<<"tinyshell:~>";
std::getline(std::cin, check);
if(check == "exit"){
exitstatus==true;
}
if(exitstatus==false&&check!="cd..")
{
pid = fork();
perror("");
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
//return 1;
}
else if (pid == 0) { /* child process */
execvp(args[0],args);
perror("");
}
else if(check!= "&"){/* parent will wait for the child to complete */
wait(NULL);
perror("");
// cout <<"Child Complete" << endl;
}
else
{
}
}
}
return 0;
};
Вы делаете 'fork()', поэтому у вас может быть несколько процессов для завершения. И дочерний процесс наследует значение 'exitstatus'' false' на 'fork()' time, поэтому ему требуется отдельное закрытие. Попробуйте добавить 'getpid()' result в приглашение «tinyshell», чтобы посмотреть, с каким процессом вы разговариваете. – CiaPan