关于在我自己的unix shell中管理进程的问题,我有一些关于使用SIGINT和SIGTSTP的问题。但是这里的第一个代码是:
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
}
}
此函数只接收输入的操作和参数,分叉新进程并执行它。
现在我的signalhandler功能:
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;
}
shell本身工作正常,我现在需要扩展它以便能够通过按CTRL + C来终止前台进程或使用CTRL + Z停止进程。
我想我理解了Signalhandler的作用,但是杀死(a,SIGINT)是将信号SIGINT传输到我的进程的正确方法吗? (&#34; a&#34;是我的分叉pid的全局变量,这意味着我分叉的最后一个进程)。
我的问题是,当在后台启动进程然后在前台启动另一个进程时,它会在按CTRL + C时杀死这两个进程。
SIGTSTP signalhandler似乎根本不起作用(什么都不做 - 进程只是在前台继续运行)。
我在做什么完全错了?