我正在用 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)
发送信号后,主进程结束,但脚本继续打印。
脚本中的信号处理是否有所不同?您需要如何停止子进程忽略正在运行的进程?
我想在后台监听操作系统信号,但在前台处理它。
这是示例代码。主循环无限期地每秒打印“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)
真正的程序是一个基于堆栈的语言解释器,用户可以在终止时运行某些内容,但目前主循环可以同时更改堆栈。
考虑到下面的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) 编辑:解决了.
嗨,我从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()
它永远不会被击中.这有什么问题?谢谢!
我是DSP编程的新手,我想知道如何最好地执行水平调整的看似基本的操作.假设我有一个8位数字代表我希望信号以256步进入的幅度.我有一组代表信号数据的16位数字.基于"音量"参数缩放信号数据的最佳方法是什么,以便说0是完全衰减,255使数据保持不变?
嗨,这个代码有问题.当我使用此功能时,我没有任何警告.:
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++编写并使用SFML 2D库的小蛇游戏.问题是:为了渲染一个窗口,并在其中打印任何东西,你必须通过一个窗口
while (App->IsOpened())
{
//Do the stuff
App->Clear();
App->Display();
}
Run Code Online (Sandbox Code Playgroud)
但是,我想以更通用的方式构建我的程序,这将使我能够只是初始化窗口,然后向其发送信号,例如其中的"RenderARect"或"ClearTheWindow",从外部声明.它会让我使用我的渲染类实例作为动态库例如,制作游戏代码,渲染代码两个不同且独立的东西......
你对如何在我的SFML程序中实现这样一个信号系统有什么建议吗?
PS:我已经习惯了libsigc ++,但不知道如何实现它......
谢谢!
在我看来,这两个signal
和socket
可用于这项工作,
你如何决定实际使用哪一个?
在信号处理程序中,我正在改变变量的值.但是,程序从未注意到更新,即使我已将变量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,正如我通过在信号处理程序中打印其值所看到的那样.
如何在内核中处理信令(中断)机制?我问的原因是:某种方式我的应用程序收到了SIGABRT信号,我想找到它来自哪里..