gpt4 book ai didi

c - shell(bash) 如何在 linux 中工作,即它如何处理后台运行进程

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

这是我的代码:

#include<stdio.h>
#include<signal.h>
void my_isr();
int main()
{
signal(SIGALRM,my_isr);
alarm(5);
pause();
printf("in main()...\n");//case2 comments it //case 1 & 3 uncomments it
return 0;//case 1 & 2 comments this line // case 3 uncomment it
}
void my_isr()
{
printf("I am in my_isr()\n");
}

如果我在后台运行进程

案例 1:如果我没有在 main 作用域末尾的 main 函数中返回 0,它 ( shell-bash) 打印 exit 值 13(最后一个 printf 中的可打印字符数)。为什么只有最后一个 printf ?是未定义的行为吗?

xyz@xyz-PC:~/s_flow$ ./a.out &
[1] 9158
xyz@xyz-PC:~/s_flow$ I am in my_isr()
in main()...

[1]+ Exit 13 ./a.out

然后 shell 打印状态值为 13Exit

情况 2:如果在 main() 的末尾没有 return 0 并且我删除了 last printf(打印 13 个字符)

xyz@xyz-PC:~/s_flow$ ./a.out &
[1] 9169
xyz@xyz-PC:~/s_flow$ I am in my_isr()

[1]+ Exit 255 ./a.out

然后 shell 打印状态值为 255 的 Exit。如何?

情况 3:最后,如果所有内容都正确提供,即如果我在 main() 末尾提到 return 0,则 shell 打印的 Done 消息没有值(value)。

xyz@xyz-PC:~/s_flow$ ./a.out &
[1] 9178
xyz@xyz-PC:~/s_flow$ I am in my_isr()
in main()...

[1]+ Done ./a.out

我大致理解了为什么 bash shell 打印 Exit 13, Exit 255 & Done 但任何进一步的解释是欢迎。我真正的问题是当一个进程在后台运行时 shell 如何与操作系统交互,我在哪里可以找到这些 shell 消息?以及 OS 如何将这些状态值返回给 shell & 然后 shell 打印?任何帮助表示赞赏。提前致谢。

最佳答案

13 是您程序的结果代码。它在两种情况下都以结果代码 13 终止——当它在后台和前台运行时。但是当程序在前台运行时,bash 不会打印结果代码。但是您可以检查前台运行的结果代码实际上是 13:

$ ./a.out
in isr() 16664:..
in isr() 16664:..
in main()...
$ echo $?
13

为什么是 13?结果代码通常是 main() 函数的结果代码。但是 main() 函数不包含任何返回语句,因此结果取决于体系结构。在这种情况下,值 13 是最后一次 printf 调用的返回值,因为

printf("in main()...\n");

返回 13 打印字符串的长度。值 13 偶然保留在寄存器中。

关于c - shell(bash) 如何在 linux 中工作,即它如何处理后台运行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853659/

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