小编Jol*_*lta的帖子

如何在GNU make中捕获错误和中断?

我想知道是否有一种方法可以trap在GNU中实现make,类似于内置的BASH

如果用户按下CTRL-C,或者make自身失败(非零退出),我想调用特定目标或宏.

signals makefile gnu-make bash-trap

14
推荐指数
3
解决办法
6124
查看次数

陷阱信号在儿童背景过程中

在子/后台进程中运行时,我无法捕获信号.

这是我简单的bash脚本:

#!/bin/bash

echo "in child"

trap "got_signal" SIGINT

function got_signal {
  echo "trapped"
  exit 0
}

while [ true ]; do
    sleep 2
done
Run Code Online (Sandbox Code Playgroud)

当运行这个以后再做

kill -SIGINT (pid)
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,打印"被困"并退出.

现在,如果我从父脚本启动相同的脚本,如下所示:

#!/bin/bash

echo "starting the child"

./child.sh &
Run Code Online (Sandbox Code Playgroud)

然后孩子不再陷入信号......?

更改为使用SIGTERM而不是SIGINT后,它似乎正常工作......?

bash signals sigint child-process bash-trap

14
推荐指数
2
解决办法
7414
查看次数

在Linux内核源代码中实现系统调用/陷阱

我目前正在学习操作系统使用陷阱来促进Linux内核中的系统调用.我在traps.c中找到了陷阱表,并在entry.S中实现了许多陷阱.

但是,我被指示在Linux内核中找到两个系统调用的实现,它使用陷阱来实现系统调用.虽然我可以找到陷阱本身的定义,但我不确定内核中的其中一个陷阱的"调用"是什么样的.因此,我正在努力寻找这种行为的一个例子.

在有人问之前,是的,这是作业.

作为一个注释,我正在使用Github浏览内核源代码,因为kernel.org已关闭:https: //github.com/torvalds/linux/

c kernel system-calls linux-kernel

13
推荐指数
2
解决办法
3712
查看次数

外部禁用Linux程序的信号

在Linux上,是否有可能以某种方式禁用外部程序的信令...即,不修改其源代码?

语境:

我在Linux上的bash脚本中调用了一个C(也是一个Java)程序.我不希望我的bash脚本和脚本启动的其他程序(作为前台进程)中断.

虽然我可以用...

trap '' INT
Run Code Online (Sandbox Code Playgroud)

...在我的bash脚本中禁用Ctrl C信号,这仅在程序控件恰好在bash代码中时才有效.也就是说,如果我在C程序运行时按下Ctrl C,C程序会被中断并退出!这个C程序正在进行一些关键操作,因此我不希望它被中断.我无法访问此C程序的源代码,因此C程序内的信号处理是不可能的.

#!/bin/bash

trap 'echo You pressed Ctrl C' INT 

# A C program to emulate a real-world, long-running program,
# which I don't want to be interrupted, and for which I 
# don't have the source code!
#
# File: y.c
# To build: gcc -o y y.c
#
# #include <stdio.h>
# int main(int argc, char *argv[]) {
#  printf("Performing a critical operation...\n");
#    for(;;); // …
Run Code Online (Sandbox Code Playgroud)

linux bash signals external bash-trap

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

使用memcpy避免陷阱表示

请考虑以下代码:

float float_value = x; // x is any valid float value
int int_value = 0;
size_t size = sizeof(int) < sizeof(float) ? sizeof(int) : sizeof(float);
memcpy(&int_value, &float_value, size);
Run Code Online (Sandbox Code Playgroud)

据我所知,这可能导致陷阱表示.我的问题:

  1. 真的吗?
  2. 如果没有,为什么?
  3. 如果没有,是否有另一种方法可以避免可能的陷阱表示?

c memcpy

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

Bash没有在rsync/subshel​​l exec语句中捕获中断

语境:

我有一个bash脚本,其中包含一个子shell和一个EXIT伪信号的陷阱,并且它没有正确捕获中断期间的中断rsync.这是一个例子:

#!/bin/bash
logfile=/path/to/file;
directory1=/path/to/dir
directory2=/path/to/dir

cleanup () {
     echo "Cleaning up!"
     #do stuff
     trap - EXIT 
}

trap '{
    (cleanup;) | 2>&1 tee -a $logfile
}' EXIT

(
    #main script logic, including the following lines:
    (exec sleep 10;);        
    (exec rsync --progress -av --delete $directory1 /var/tmp/$directory2;);

)  | 2>&1 tee -a $logfile
trap - EXIT #just in case cleanup isn't called for some reason
Run Code Online (Sandbox Code Playgroud)

脚本的想法是这样的:大多数重要的逻辑运行在子shell中,通过管道传输tee到日志文件,因此我不必tee将主逻辑的每一行都记录下来.每当子shell结束,或脚本因任何原因停止(EXIT伪信号应捕获所有这些情况),陷阱将拦截它并运行该cleanup()函数,然后删除陷阱.该rsyncsleep命令(睡眠只是一个例子)通过运行exec,以防止僵尸进程的创建,如果我杀了父脚本,而他们正在运行,并且每个潜在的,长期运行的命令被包裹在自己的子shell,这样,当exec …

linux bash shell rsync bash-trap

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

陷阱火灾后退出

拿这个脚本

#!/bin/sh

fd ()
{
  echo Hello world
  exit
}

trap fd EXIT INT

for g in {1..5}
do
  echo foo
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

我想fd从Control-C或者脚本正常退出时触发一次.但是,如果你点击Control-C它会运行两次.我怎样才能解决这个问题?

bash shell-trap

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

Groovy文件检查

我是一名java新手,最近我去了一个采访.他们问了一个类似的问题:设置Groovy,测试样本json文件是否有效.如果有效,请运行json文件.如果不是,请打印"文件无效".如果找不到文件,请打印"找不到文件".我有2个小时的时间去做,我可以使用互联网.

由于我不知道groovy是什么或json是什么,我搜索它并设置groovy但无法在两小时内获得输出.我该怎么写?我尝试了一些代码,但我确信这是错误的.

groovy json

10
推荐指数
1
解决办法
4万
查看次数

在声明'陷阱'块后,Bash信号捕获未检测到变量

我有一堆通用的清理代码需要在某个bash脚本退出时完成,无论它是正常退出还是被中断.我想我会使用trap "..." EXIT伪信号来实现这一点.

除了通用的清理工作之外,还有一个特定的清理工作,只有在脚本正常完成时才能完成.我想我可以通过让'trap'块测试一个变量来触发这个,就像这样:

#!/bin/bash
done=false;
trap "{        
           #generic cleanup code goes here.
           if $done
           then
               #cleanup to be done only on completion goes here.
               echo Test;
           fi
       }" EXIT
#main script goes here
done=true;
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.运行以下代码永远不会回显"测试".之后添加显式exit调用done=true;不会更改任何内容.我错过了什么?

干杯!

bash shell scope bash-trap

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

Bash脚本:无法正确处理SIGTSTP

我有一个bash脚本,可以安装和卸载一个设备,在其间执行一些读取操作.由于设备非常慢,脚本需要大约15秒才能完成(安装至少需要5-6秒).由于安装此设备可能会导致其他问题,我不希望此脚本被中断.

话虽如此,我可以正确处理SIGINT(Ctrl + c),但是当我尝试处理SIGTSTP(Ctrl + z)时,脚本会冻结.这意味着信号被捕获但处理程序不运行.

#!/bin/sh
cleanup()
{
    # Don't worry about unmounting yet. Just checking if trap works.
    echo "Quitting..." > /dev/tty
    exit 0
}
trap 'cleanup' SIGTSTP
...
Run Code Online (Sandbox Code Playgroud)

我手动必须将KILL信号发送到进程.知道为什么会发生这种情况以及如何解决这个问题吗?

linux bash signals bash-trap

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