标签: signals

向运行脚本的分叉 exec 进程发送 SIGINT 不会杀死它

我正在用 C 编写 shell 应用程序,遇到一个问题,发送 SIGINT 来处理正在运行的脚本不会阻止它。

向普通可执行文件发送相同的信号效果很好。

例子:

Bash 脚本只是模仿长工作脚本(work.sh):

#! /bin/bash

COUNTER=0
while true
do
    ((COUNTER+=1))
    echo "#${COUNTER} Working..."
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

C代码:

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        char* cmds[] = { "./work.sh", NULL };
        if (execvp(cmds[0], cmds) == -1) {
            exit(1);
        }
    } else {
        sleep(5);
        kill(pid, SIGINT);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

发送信号后,主进程结束,但脚本继续打印。

脚本中的信号处理是否有所不同?您需要如何停止子进程忽略正在运行的进程?

c bash signals

1
推荐指数
1
解决办法
2559
查看次数

在 Go 中前台处理信号

我想在后台监听操作系统信号,但在前台处理它。

这是示例代码。主循环无限期地每秒打印“boop”。但是,当收到中断信号时,处理程序会打印“Terminate Slow...”,并等待五秒钟,然后再终止程序。

package main

import (
    "fmt"
    "os"
    "os/signal"
    "time"
)

func main() {
    c := make(chan os.Signal)
    signal.Notify(c, os.Interrupt)
    go func() {
        <-c
        fmt.Println("Terminating slowly...")
        time.Sleep(time.Duration(5)*time.Second)
        os.Exit(0)
    }()

    for {
        fmt.Println("boop")
        time.Sleep(time.Duration(1)*time.Second)
    }
}
Run Code Online (Sandbox Code Playgroud)

当信号被处理时,我希望其他一切都被阻止。但目前在缓慢终止的五秒内,它不断打印“boop”。

我明白了:

boop
boop
^CTerminating slowly...
boop
boop
boop
boop
boop
Run Code Online (Sandbox Code Playgroud)

我想要这个:

boop
boop
^CTerminating slowly...
Run Code Online (Sandbox Code Playgroud)

真正的程序是一个基于堆栈的语言解释器,用户可以在终止时运行某些内容,但目前主循环可以同时更改堆栈。

signals foreground go

1
推荐指数
1
解决办法
597
查看次数

角度信号 - 使用 mutate() 与使用 forEach() 反应性

考虑到下面的Angular Signals示例,我对何时应该使用 Signal API(如mutate()update() )、何时使用 Array API(如forEach)足以触发反应性并更新 UI/模板感到有些困惑?这里有什么区别呢?使用的角度版本:16.0.1

@Component({
  selector: 'my-app',
  standalone: true,
  imports: [CommonModule],
  template: `
    {{usersList() | json}}
  `,
})
export class App {
  usersList: Signal<any> = inject(UserService).getUsersList();
  constructor() {
 
  }
}

bootstrapApplication(App);

@Injectable({
  providedIn: 'root',
})
export class UserService {
  private users = signal([
    { id: 1, name: 'Peter', country: 'USA' },
    { id: 2, name: 'Party Boy', country: 'USA' },
    { id: 3, name: 'John Connor', country: 'USA' …
Run Code Online (Sandbox Code Playgroud)

signals angular angular-signals

1
推荐指数
1
解决办法
888
查看次数

如何连接槽以在Qt中发信号通知QProcess :: started()?

编辑:解决了.

嗨,我从Qt开始,我尝试连接一个插槽信号,QProcess::started()但不能.QObject::connect()回报false.

知道我做错了什么吗?

这是代码的一部分:


class foo : public QObject
{   
 public:
  QProcess *process;

 public slots:
  void process_started();
}

foo::foo()
{
 process = new QProcess();
 bool status = QObject::connect( process, SIGNAL( started() ), this, SLOT( process_started() ) );
 // status is false, meaning the slot and signal couldn't be connected
}
Run Code Online (Sandbox Code Playgroud)

我知道这个过程成功启动,因为我尝试过process->WaitForStarted()并返回true.但是我在插槽上放了一个断点,foo::process_started()它永远不会被击中.这有什么问题?谢谢!

qt signals qt4 signals-slots

0
推荐指数
1
解决办法
4171
查看次数

基本的DSP级别调整

我是DSP编程的新手,我想知道如何最好地执行水平调整的看似基本的操作.假设我有一个8位数字代表我希望信号以256步进入的幅度.我有一组代表信号数据的16位数字.基于"音量"参数缩放信号数据的最佳方法是什么,以便说0是完全衰减,255使数据保持不变?

signals signal-processing

0
推荐指数
1
解决办法
599
查看次数

Prob比较C中的指针和整数

嗨,这个代码有问题.当我使用此功能时,我没有任何警告.:

    void handler(int sig){
   switch(sig) {
     case SIGINT : { click++; fprintf(stdout,"SIGINT recu\n");
                           if( click == N){
                             exit(0);
                           }
   }
     case SIGALRM : fprintf(stdout,"SIGALRM received\n");
                    exit(0);
     case SIGTERM:  fprintf(stdout,"SIGTERM received\n");
                     exit(0);


  }
  }
Run Code Online (Sandbox Code Playgroud)

但是当我用这个新版本重写函数时,我在if语句中有一个" 指针和整数之间的比较 "警告:

void handler( int sig){
   printf("Signal recu\n");
    if( signal == SIGINT){
     click++;
     fprintf(stdout,"SIGINT received; Click = %d\n",click);
     if(click == N){
      fprintf(stdout,"Exiting with SIGINT\n");
       exit(0);
     }
   } else if(signal == SIGALRM){
      fprintf(stdout,"SIGALRM received\n"); 
      exit(0);
   } else if(signal == SIGTERM){
     fprintf(stdout,"SIGTERM received\n"); 
     exit(0);
   }
Run Code Online (Sandbox Code Playgroud)

有人能告诉我问题在哪里吗?

c signals

0
推荐指数
1
解决办法
226
查看次数

如何管理SFML渲染,"信号"方式?

我正在开发一个用C++编写并使用SFML 2D库的小蛇游戏.问题是:为了渲染一个窗口,并在其中打印任何东西,你必须通过一个窗口

while (App->IsOpened())
{
    //Do the stuff
    App->Clear();
    App->Display();
}
Run Code Online (Sandbox Code Playgroud)

但是,我想以更通用的方式构建我的程序,这将使我能够只是初始化窗口,然后向其发送信号,例如其中的"RenderARect"或"ClearTheWindow",从外部声明.它会让我使用我的渲染类实例作为动态库例如,制作游戏代码,渲染代码两个不同且独立的东西......

你对如何在我的SFML程序中实现这样一个信号系统有什么建议吗?

PS:我已经习惯了libsigc ++,但不知道如何实现它......

谢谢!

c++ signals signals-slots sfml

0
推荐指数
1
解决办法
731
查看次数

在同一台机器,信号或插座上进行进程间通信,如何决定?

在我看来,这两个signalsocket可用于这项工作,

你如何决定实际使用哪一个?

c sockets signals ipc

0
推荐指数
1
解决办法
1156
查看次数

信号处理程序内部的变量更新永远不会更新

在信号处理程序中,我正在改变变量的值.但是,程序从未注意到更新,即使我已将变量leader_barrier声明为sig_atomic_t.

void timer_action(int signum)
{   
static int count = 0;

 if ( !(*pbarrier_in_proc) && !(leader_barrier) && !(*pno_more) )
  leader_barrier = 1;
}
Run Code Online (Sandbox Code Playgroud)

并且它确认了timer_action确实执行并且leader_barrier确实在其中变为1,正如我通过在信号处理程序中打印其值所看到的那样.

c linux signals handler

0
推荐指数
1
解决办法
357
查看次数

在内核中发送或处理linux信号的地方?

如何在内核中处理信令(中断)机制?我问的原因是:某种方式我的应用程序收到了SIGABRT信号,我想找到它来自哪里..

linux kernel signals abort

0
推荐指数
1
解决办法
695
查看次数