【问题标题】:Unix/Linux: Handler of SIGCONT/SIGTSTPUnix/Linux:SIGCONT/SIGTSTP 的处理程序
【发布时间】:2011-06-07 08:43:20
【问题描述】:

我目前正在使用信号编写程序,但遇到了这个问题:

如何在不发送SIGSTOP/SIGCONT的情况下将执行程序的状态更改为停止/运行?

我明白,我需要使用:

 void add_to_runqueue (struct task_struct * p)

void del_from_runqueue (struct task_struct * p)

但是如何获取当前运行进程的结构task_struct呢?

另外:如果这就是我需要做的所有事情(调用这两个函数)。

提前致谢!

【问题讨论】:

    标签: unix signals signal-handling


    【解决方案1】:

    这些函数将是内核函数,即操作系统内部的函数。当您编写程序时,您需要通过适当的系统调用,在您的情况下为kill

    当你有一个程序进程 ID(即它的编号)时,你可以使用

    kill(pid, SIGSTOP);
    

    kill(pid, SIGCONT);
    

    除非您知道自己在做什么,否则不应使用SIGTSTP

    【讨论】:

    • 我知道 :) 并且发送信号对我来说不是问题。进程还必须停止并继续另一个进程,所以我想处理这两个信号(由用户通过控制台发送)。 continue 的简单用法并不能让我满意..
    • 您无法处理 SIGSTOP,它是具有固定含义的信号之一。您可以通过忽略它(您的程序继续)或清理您的状态然后向自己发送 SIGSTOP 来处理 SIGTSTP。
    • 让我澄清一下:这是关于编写信号处理程序而不是发送信号。如果用户向我的程序发送信号(它是 SIGTSTP 或 SIGCONT),它应该停止另外 2 个进程(它们是分叉的系列)然后停止自身或(或继续适当地)。我很清楚特定信号的作用。问题:我应该使用什么函数,以及如何将 task_struct.state 字段更改为 TASK_RUNNING 到 TASK_STOPPED 或 TASK_RUNNING 到 TASK_STOPPED。我在阅读 sched.h 时学到了很多东西,但是我不是以英语为母语的用户,而且还有很多我不知道的东西。对不起我的英语不好。
    • 您可以向自己发送信号。在处理 SIGTSTP 时,您将通过 SIGTSTP 停止子进程,然后将 SIGSTOP 发送给自己。对于 SIGCONT,不需要对自己的进程进行特殊处理。
    • 还有其他方法吗?正如我之前所说:信号不能满足我。
    猜你喜欢
    • 2014-12-09
    • 2023-04-11
    • 2023-03-17
    • 2017-05-06
    • 1970-01-01
    • 2019-08-04
    • 2014-08-29
    • 2020-03-31
    • 2012-12-03
    相关资源
    最近更新 更多