gpt4 book ai didi

使用 forkpty() 创建了一个 bash shell。这个 shell 启动的程序似乎在忽略 SIGINT 的情况下启动。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:45 25 4
gpt4 key购买 nike

我有一个使用 forkpty 执行 bash shell 的 C 程序。我发现这个 shell 启动的程序是在忽略 SIGINT 的情况下启动的,所以当我向 shell 发送 Ctrl-C 时,它们永远不会关闭。

例子:

int masterFd;
char* args[] = {"/bin/bash", "-i", NULL };
int procId = forkpty(&masterFd, NULL, NULL, NULL);
if( procId == 0 ){
execve( args[0], args, NULL);
}
else {
// Simple code that reads from standard in and writes to masterFd.
// I also register for Ctrl-C and write it to masterFd if caught
}

其他的控制字符好像都能通过,ctrl-D, ctrl-?等。但是,每当我查看由新 bash shell 启动的进程的状态时,它似乎 SIGINT 被屏蔽了。

MyShell:# sleep 1000

StandardTerm:# ps -ef | grep sleep
root 26611 19278 0 17:44 pts/1 00:00:00 sleep 1000
root 26613 32376 0 17:44 pts/1 00:00:00 grep sleep

StandardTerm:# grep Sig proc/26611/status
SigQ: 0/256428
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000010006 <- THE 6 IS THE PROBLEM
SigCgt: 0000000180000000

SigIgn 设置了 2 位,这意味着 2 (SIGINT) 被忽略。如果我做完全相同的事情,但在标准终端中运行 sleep(或 cat 一个巨大的文件或其他),则该位被清除。当我启动我的 pty bash 导致它创建忽略 SIGINT 的孙程序时,我在做什么?

此外,如果我向进程发送 SIGINT 信号

StandardTerm:# kill -2 26611

没有任何反应。奇怪的是,当我向 bash shell 发送相同的命令时,我 forkpty'ed IT 起作用了,因为那个 bash shell 没有忽略 SIGINT。

提前致谢!

最佳答案

父进程是否屏蔽了SIGINT

fork()execve() 都将信号掩码传播到子进程,也许是这种情况?

关于使用 forkpty() 创建了一个 bash shell。这个 shell 启动的程序似乎在忽略 SIGINT 的情况下启动。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33613539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com