小编Ale*_*ing的帖子

检测发送到进程的信号的最简单方法是什么?

我正在尝试调试我的 shell(特别是fish)向后台进程发送信号的问题。我希望能够识别进程正在接收哪些信号。

理想情况下,我想要一些可以执行以下操作的程序:

$ log_signals > signals.txt &
Run Code Online (Sandbox Code Playgroud)

然后它将接收到的信号写入其输出。但是,我不相信任何这样的程序容易存在。

捕获传入信号并检查它们的最简单方法是什么,最好不需要编写自己的程序?

(我运行的是 OS X,而不是 Linux,所以如果可能的话,我更喜欢与平台无关的答案。)

osx shell process signals fish

16
推荐指数
2
解决办法
1万
查看次数

在每个文件名之前插入带有标志的扩展 glob

我有一个需要以下语法参数的程序:

prog [-f filename | -g filename1 filename2] ...
Run Code Online (Sandbox Code Playgroud)

每个文件名都必须以-f标志为前缀。例如,以下是对 的有效调用prog

prog -f a.txt -g b.txt c.txt -f d.txt
prog -g a.txt b.txt -g c.txt d.txt
prog -f a.txt -f b.txt -f c.txt
Run Code Online (Sandbox Code Playgroud)

……但以下不是:

prog -f a.txt b.txt
prog -f a.txt -g b.txt
prog a.txt
Run Code Online (Sandbox Code Playgroud)

就我而言,我只关心-f选项。

我在一个目录中有很多文件,所有文件都以.txt. 它们看起来像这样:

important-files/
??? a.txt
??? b.txt
??? c.txt
??? d.txt
??? filename with spaces.txt
Run Code Online (Sandbox Code Playgroud)

我想避免需要一一列出每个文件。通常,我会为此使用一个简单的 glob:

$ prog important-files/*.txt
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它产生以下无效调用:

$ prog important-files/a.txt important-files/b.txt …
Run Code Online (Sandbox Code Playgroud)

bash wildcards

12
推荐指数
5
解决办法
953
查看次数

从子进程的角度来看,进程的父进程是否有任何意义?

在 POSIX 中,进程通过两个基本层次结构相互“关联”:

  1. 父进程和子进程的层次结构。

  2. 会话和进程组的层次结构。

用户进程通过setpgid和对后者有很大的控制权setsid,但他们对前者的控制很少——父进程 ID 在进程生成时设置,并在父进程退出时由内核更改(通常为 PID 1 ),否则它不会改变。回想起来,我一直在想亲子关系到底有多重要。

总结一下我目前的理解:

  • 进程的角度来看,父子关系显然很重要,因为各种系统调用,如waitsetpgid,只允许在子进程中使用。

  • 会话-组-进程关系显然对所有进程都很重要,包括会话领导者和会话中的其他进程,因为像kill对整个进程组进行操作的系统调用setpgid只能用于在同一会话中加入一个组,并且所有进程SIGHUP如果会话领导者退出,会话的前台进程组中的消息将被发送。

  • 更重要的是,从父级的角度来看,这两个层次结构显然是相关的,因为setsid只影响新的子级,setpgid只能用于子级,但从子级的角度来看它们似乎基本无关(因为父进程死亡没有任何影响)在进程的组或会话上)。

然而,显然没有任何理由让子进程关心它的当前父进程是什么。因此,我有以下问题:从子进程的角度来看,的当前值是否getppid()有任何重要性,除了可能确定其生成过程是否已退出?


换一种方式提出同样的问题,假设同一个程序以两种不同的方式从同一个父级产生两次:

  1. 第一个孩子以通常的方式产生,fork()紧接着是exec().

  2. 第二个子进程是间接产生的:父进程调用fork(),然后子进程调用fork(),而孙子进程调用exec()。然后直接子进程退出,因此孙子进程成为孤儿,它的 PPID 被重新分配给 PID 1。

在这个假设场景中,假设所有其他条件都相同,是否有任何合理的程序有理由做出不同的行为?到目前为止,我的结论似乎是“不”,因为会话保持不变,进程继承的文件描述符也是如此……但我不确定。

注意:我不认为“获取父 PID 与其通信”是该问题的有效答案,因为孤立程序通常不能依赖于将其 PPID 设置为 1(某些系统将孤立进程的 PPID 设置为某些其他值),因此避免竞争条件的唯一方法是getpid() 分叉之前 …

process posix process-groups

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

标签 统计

process ×2

bash ×1

fish ×1

osx ×1

posix ×1

process-groups ×1

shell ×1

signals ×1

wildcards ×1