Использование SIGINT и SIGTSTP для обработки процессов переднего плана в оболочке Unix

У меня есть несколько вопросов относительно использования 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, похоже, не работает вообще (ничего не делает — процесс просто продолжает работать на переднем плане).

Я совершенно не прав с тем, что я делаю?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]