使用SIGINT和SIGTSTP处理前台进程unix shell

时间:2017-11-14 21:22:36

标签: c++ shell unix process sigint

关于在我自己的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似乎根本不起作用(什么都不做 - 进程只是在前台继续运行)。

我在做什么完全错了?

0 个答案:

没有答案