问题标签 [job-control]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - 为什么 gdb 的工作前景正在失去它?
我有一个启动服务器的脚本,然后是一堆客户端,然后我需要将服务器置于前台,这样我就可以测试一些东西。出于某种原因,服务器很快就退出了,就好像根据某些信号一样,所以我想用 gdb 来检查它。
run
问题是,前台 gdb 在执行命令时被分离。这是一个简单的示例sh
(--nh
用于 gdb 忽略配置):
您可以看到,它与外壳分离,并挂在进程列表中。
我zsh
还bash
经常遇到以下错误:
…并且 gdb 没有出现在进程列表中。但有时(不是很常见)zsh
和中的行为bash
与 with 相同sh
,即没有错误,并且 gdb 被分离。
总而言之,gdb是怎么回事?
bash - 如何获取和保存后台命令的 bash “jobspec”?
当我在后台通过 启动命令时,command &
可以从变量中检索命令的进程 ID $!
。此值可以保存并在以后的命令中使用,例如kill
.
然而,一些内置插件,特别是fg
需要一个“jobspec”,它是一个特殊的 shell 东西,以%
. 因此,如果我启动一个后台命令,我可以在之后通过 将其置于前台command & fg %+
,因为%+
它是最近后台命令的作业规范。
如果我在后台启动两个命令,我可以使用 : 将第一个命令放在前台%-
,这是 jobspec 的先前%+
值 command1 & command2 & fg %-
。
但这不能概括为三个命令。通常需要的是能够为%nnn
刚刚在后台盯着的命令保存作业规范。这可以通过类似的东西来完成jobs | sed -e '$!d' -e 's/^\[\([0-9]\+].*$/%\1/
,但应该有比这更好的方法。
c - 后台进程和挂起进程 - 在 C 中实现作业控制外壳
我正在 Linux 中以 C 语言实现作业控制外壳,作为操作系统相关主题的项目。我有一个执行子进程管理的 main() 函数,它帮助了一个链接列表,如此处所示,其中存储了背景和暂停的作业信息:
每次子进程退出或停止时,都会向父进程发送一个 SIGCHLD 以得到通知。然后,我有一个信号处理程序,如此处所示,对于该作业状态链表的每个节点,检查该节点中表示的进程是否已退出,如果退出,则将该节点从链表中删除。这是 SIGCHLD 处理程序的代码,其中 'job_list' 是存储信息的链表:
问题是,当处理程序被调用时,一些不应该被删除的条目,因为它们所代表的进程没有退出,当它们不应该被删除时被删除。任何人都会知道为什么会这样?
谢谢你,对你失去的时间感到抱歉:(
c - 如何制作后台进程块以输入 la shell 的 `bg` 命令?
为了安全控制目的,我正在实现自己的代码片段。它通常在后台运行,但在超时时需要接管当前终端,显示消息,收集用户输入,并对用户输入做出反应。
等待超时很容易。在活动程序中收集用户输入sleep
很容易。防止外壳窃取我刚刚尝试收集的用户输入并不是那么容易。
我有理由相信“如果两个程序这样做会怎样?” 不适用。如果在我们等待输入时触发了另一个程序,那还不错。如果用户想要干扰安全检查,还有比这更简单的方法。
bash - 外壳,管道接收端的作业控制
我不明白,为什么我不能在后台运行某个进程(本例中为“cat”),然后将其设为前台:
为什么每次我收到错误消息?
在没有管道的情况下运行函数“f”时,有时我没有这样的消息:
c - 在 C 中实现类似 shell 的作业控制
我正在尝试用 C 语言实现简单的 shell,但我很难实现作业控制。网上的一切似乎都足够复杂,我认为简单一点总是好的。所以让我问这个......在调用 fork() 之后,我可以只用 2 个函数和 pid 处理 Ctrl-Z 信号吗?
我想put_background(pid_t pid)
在按下 Ctrl-Z 时调用一个函数 ex 并使用 pid = pid 使进程运行后台,最后put_foreground(pid_t pid)
在我编写 fg 时调用另一个函数 ex 并且我希望 pid = pid 的进程再次进入前台。
那么,这可能吗?任何帮助表示赞赏.. 代码更多但是。
glibc - 终止 shell 的步骤
我已经阅读了glibc
手册中关于作业控制的章节,但我想知道当 shell 终止时如何处理剩余的作业。
我想以下步骤(遵循 posix 处理孤立进程组的约定,前两个步骤似乎很明显):
- 使用 shell 的 sid 向作业发送 HUP 信号
- 使用 shell 的 sid 向停止的作业发送 CONTINUE 信号
- 释放分配给作业数据结构的资源
我的问题是,如果工作继续存在怎么办?
我认为有机会更改他们的会话 ID 以释放 sid 并解除进程组与终端的关联(不确定这是否有意义)
我应该怎么做ioctl(STDIN_FILENO, TIOCSCTTY)
才能使会话进程失去控制终端并发送信号?
该怎么办tty
?我应该启动登录并将其设置为 tty 的新控制终端进程组吗?
我仍然很困惑,我们将不胜感激。
bash - 后台和前台 bash/zsh 作业,无需在“继续/暂停”消息中添加换行符
我有一个过程是这样的:
- 运行一个在一堆文件中生成一堆结果的命令
- 在 vim 中打开一个文件
- 编辑其中一个结果
- 后台vim,得到下一个结果,前台vim
- 重复直到列表完成
但是,每次我在后台和前台使用 vim 时,bash/zsh 都会打印两条如下所示的消息:
这些很烦人,因为它们占用了屏幕空间,最终结果会从屏幕上过滤掉。我必须重新运行命令或不断上下滚动才能找到它。
有没有办法获得“继续/暂停”消息以避免添加这么多换行符?或者,我可以完全压制它们吗?
bash - 如何仅使用默认 bash 命令创建作业?
所以,我大约一个月前开始研究 UNIX 系统,现在我有一个关于作业控制的基本问题
如何仅使用默认的 bash 命令创建一个包含多个进程的作业?
c - How to change signal handler in child-process?
I'm writing a shell with job control. The main process should ignore stop-signals and handle SIGCHLD. Child process after fork() should set signals to SIG_DFL. The problem is that my child process ignores signals too.
At the start of my program I set shell to foreground and initialize signals
after fork() in child process:
But child process ignores signals