gpt4 book ai didi

c - C:暂停system()调用

转载 作者:行者123 更新时间:2023-12-03 12:55:42 25 4
gpt4 key购买 nike

当我尝试暂停system()调用的执行时,我在C中遇到问题。

线程重复调用某些应用程序(例如某些基准)。每当收到SIGUSR1信号时,应在接收到SIGUSR2时暂停执行并恢复执行。

来源看起来像这样:

#include <signal.h>
#include <pthread.h>

void* run_app(sigset_t* signalsBetweenControllerandLoad)
{
/* assign handler */
signal(SIGUSR1, pausesignal_handler)
signal(SIGUSR2, pausesignal_handler)
pthread_sigmask(SIG_UNBLOCK, signalsBetweenControllerandLoad, NULL))

/* call application repeatedly */
while(1) {
system(SOMECOMMAND);
}

return(0);
}

static void pausesignal_handler(int signo)
{
int caughtSignal;
caughtSignal = 0;

/* when SIGUSR1 is received, wait until SIGUSR2 to continue execution */
if (signo == SIGUSR1) {
signal(signo, pausesignal_handler);

while (caughtSignal != SIGUSR2) {
sigwait (signalsBetweenControllerandLoad, &caughtSignal);
}
}
}

当我使用一些命令(例如下面的for循环进行一些计算)而不是 system(SOMECOMMAND)时,此代码有效。但是,在处理程序处于 Activity 状态时,不会暂停system()调用的程序。
int i;
for(i=0;i<10;i++) {
sleep(1);
printf("Just a text");
}

有没有一种方法可以通过使用线程信号来暂停system()命令的执行?甚至还有一种方法可以停止系统调用的应用程序,而无需等待程序完成?

提前非常感谢您!

最佳答案

system在单独的进程中运行命令,该进程甚至不与调用程序共享地址空间,更不用说信号处理程序了。名为system的进程位于waitpid(或等效文件)中,因此暂停和取消暂停的效果不大(除非它已暂停,否则不会返回到循环来再次调用system。)

简而言之,无法使用发送给父进程的信号来暂停正在子进程中运行的可执行文件,例如system()调用或fork()/exec()

如果可执行文件本身实现了该功能(除非您亲自编写,否则不太可能实现),则可以将信号传递给该进程,而不是传递给system的信号。

或者,您可以将SIGSTOP信号发送到可执行文件的进程,这将无条件地暂停执行。为此,您需要了解其pid,它建议使用fork()/exec()/waitpid()序列-比system()进行更多工作,但更干净,更安全且通常更有效-并且您需要处理几个问题:

  • 进程无法阻止或捕获SIGSTOP,但是可以捕获SIGCONT,因此序列不一定是100%透明的。
  • 如果停止的过程是终端的控制过程,则需要格外小心,因为当使用SIGCONT恢复它时,它将需要重新获取终端。此外,如果应用程序已将终端置于非标准状态(例如,通过使用readlinecurses库将终端置于原始模式并禁用回显功能),则终端可能无法使用。
  • 由于停止处理的子进程,您的进程将收到SIGCHLD信号。因此,您需要正确处理。
  • 关于c - C:暂停system()调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518147/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com