代码之家  ›  专栏  ›  技术社区  ›  Di Wang

C: 按p键而不是Ctrl+Z键暂停进程

  •  0
  • Di Wang  · 技术社区  · 7 年前

    是否可以通过按键盘上的按钮(如“P”)暂停线程/进程,并通过按“R”而不是按Ctrl+Z继续进程?

    我的尝试如下:

    int sig_pause = 0; // define global variable 
    ....
    
    
    void* thread_function (void *ptr)
    {
        ....
        while(sig_flag) usleep(100); // wait if sig_flag is 1
    }
    
    
    
    /* pause function */
    void pause_handler(int sig)
    {
        if(sig==SIGTSTP)  sig_pause=1-sig_pause;
    }
    
    
    
    int main(void){
    ....
    signal(SIGTSTP, pause_handler);
    }
    

    通过按ctrl+z,上述方法可以很好地工作,但我不知道如何将其自定义为我的按键。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Raishin    7 年前

    这是因为信号只捕获发送到程序线程的非常特定的信号,通常是通过操作系统或其他进程发送的。对于任何键盘输入,标准C实际上都没有办法做到这一点。您需要的是一个键盘侦听器,它需要绑定到运行进程的窗口。通常情况下,这不包括控制台,当我环顾四周时,我找不到任何东西。如果您有某种GUI,您可能会使用线程或至少GUI库的一些事件函数。

    您可能可以使用线程让另一个线程在repeat上调用一些修改过的函数,该函数具有对可用于暂停程序的标志的共享内存访问。该线程可以处理可能阻塞的标准输入调用,如果您可以找到在操作系统上工作的代码,并进行编译,以确保调用没有阻塞,并且不需要按enter键。你不应该也不可能同时有多个东西试图从标准输入中读取。

    http://www.geeksforgeeks.org/multithreading-c-2/

    您可以创建一个线程,该线程具有一个具有无限循环的函数,该循环执行等待的任务并捕获您的输入。只是不要打电话给join。(您想让它运行。)然后,您只需要一个基于输入和静态变量或“标志”的状态机