У меня есть несколько вопросов относительно использования SIGINT и SIGTSTP в отношении управления процессами в моей собственной оболочке Unix. Но сначала код здесь:
void execute(vector<char *> argvv, bool x){pid_t pid;
int status;
int error;
pid = fork();
a = pid;
argvv.push_back(NULL);
if(pid == -1){
cout << "error" << endl;
}else if(pid == 0){
error = execvp(argvv[0],argvv.data());
if(error == -1){
exit(-1);
}
// In Child Process
}else{
// If no "&", then wait for process
if(x == false){
if(wait(&status) != pid){
perror("wait()");
}
}else{
cout << "Pid des Hintergrundprozesses: " << pid << endl;
}
// in parent process
}
}
Эта функция просто получает введенную операцию и параметры, разветвляет новый процесс и выполняет его.
Теперь мои функции обработчика сигналов:
void signalHandlerSigInt(int signum){
cout << "Interrupt Signal (" << signum <<") received." << endl;
kill(a,SIGINT);
cout << "Killed Process: " << a << endl;
}
void signalHandlerSigTStp(int signum){
cout << "Interrupt Signal (" << signum <<") received." << endl;
kill(a,SIGTSTP);
cout << "Stop process..: " << a << endl;
}
и мой main.cpp:
int main(int agc, char** argv) {
bool opBackground;
string operation;
vector<string> arguments;
vector<char *> argvv(arguments.size() + 1);signal(SIGINT, signalHandlerSigInt);
signal(SIGTSTP, signalHandlerSigTStp);while(true){
cout << "myshell>";
getline(cin,operation);if(operation == "logout"){
logout();
}else{
opBackground = befehlUebersetzen(operation, &arguments);
vector<char *> argvv(arguments.size() + 1);
for(size_t i = 0; i != arguments.size(); ++i){
argvv[i] = &arguments[i][0];
}
execute(argvv, opBackground);
arguments.clear();
}}
return 0;
}
Сама оболочка работает нормально, теперь мне нужно расширить ее, чтобы можно было убить процесс переднего плана, нажав CTRL + C или остановить процесс с помощью CTRL + Z.
Мне кажется, я понял, что делает Signalhandler, но является ли kill (a, SIGINT) правильным способом передачи сигнала SIGINT моему процессу? («a» — это глобальная переменная для моего разветвленного pid, что означает последний разложенный мной процесс).
Моя проблема в том, что при запуске процесса в фоновом режиме и последующем запуске другого процесса на переднем плане он убивает оба процесса при нажатии клавиш CTRL + C.
Также обработчик сигналов SIGTSTP, похоже, не работает вообще (ничего не делает — процесс просто продолжает работать на переднем плане).
Я совершенно не прав с тем, что я делаю?
Задача ещё не решена.
Других решений пока нет …