当前位置: 技术问答>linux和unix
脑洞大开,让一个带标准输入的程序在后台运行会怎样呢
来源: 互联网 发布时间:2017-05-25
本文导语: 今天练习套接字编程,无意间让一个需要标准输入的客户程序后台运行了,然后,就根本停不下来了~ 先不说套接字编程里面各种TCP状态的转移,就拿一个最简单的输入输出程序来说吧。 #include #include int main(void)...
今天练习套接字编程,无意间让一个需要标准输入的客户程序后台运行了,然后,就根本停不下来了~
先不说套接字编程里面各种TCP状态的转移,就拿一个最简单的输入输出程序来说吧。
够简单吧,编译这个程序让它后台运行,命令如下
[root@luqiang total]# gcc -o backscanf backscanf.c
[root@luqiang total]# ./backscanf &
[1] 4698
[root@luqiang total]#
在这个时候再敲一个回车键,输出如下
[2]+ Stopped ./backscanf
[root@luqiang total]#
接着,问题来了,调用 ps -l 命令,发现这个backscanf还在后台执行
[root@luqiang total]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 4791 4789 0 80 0 - 1310 - pts/0 00:00:00 bash
0 T 0 4815 4791 0 80 0 - 462 - pts/0 00:00:00 backscanf
4 R 0 4819 4791 0 80 0 - 1214 - pts/0 00:00:00 ps
程序的状态是T,表示TASK_STOPPED,进程停止执行:进程没有投入运行也不能投入运行。
而且,这个进程用kill命令是杀死不了的,如下
[root@luqiang total]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 4791 4789 0 80 0 - 1310 - pts/0 00:00:00 bash
0 T 0 4815 4791 0 80 0 - 462 - pts/0 00:00:00 backscanf
4 R 0 4903 4791 0 80 0 - 1214 - pts/0 00:00:00 ps
[root@luqiang total]# kill 4815
[root@luqiang total]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 4791 4789 0 80 0 - 1310 - pts/0 00:00:00 bash
0 T 0 4815 4791 0 80 0 - 462 - pts/0 00:00:00 backscanf
4 R 0 4908 4791 0 80 0 - 1215 - pts/0 00:00:00 ps
[root@luqiang total]#
唯一的终止方式是,
[root@luqiang total]# kill -CONT 4815
[1]+ Terminated ./backscanf
[root@luqiang total]#
这也是网上查来的,原文是:向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。
那这样的,原来那个程序,从开始在后台运行,一直到,接受SIGCONT信号退出,期间的TASK_STOPPED状态,和最后的终止,都是怎么样的状态呢,它应该怎样从标准输入读入内容呢?
先不说套接字编程里面各种TCP状态的转移,就拿一个最简单的输入输出程序来说吧。
#include
#include
int main(void)
{
char mes[33];
fgets(mes, 33, stdin);
fputs(mes, stdout);
return 0;
}
够简单吧,编译这个程序让它后台运行,命令如下
[root@luqiang total]# gcc -o backscanf backscanf.c
[root@luqiang total]# ./backscanf &
[1] 4698
[root@luqiang total]#
在这个时候再敲一个回车键,输出如下
[2]+ Stopped ./backscanf
[root@luqiang total]#
接着,问题来了,调用 ps -l 命令,发现这个backscanf还在后台执行
[root@luqiang total]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 4791 4789 0 80 0 - 1310 - pts/0 00:00:00 bash
0 T 0 4815 4791 0 80 0 - 462 - pts/0 00:00:00 backscanf
4 R 0 4819 4791 0 80 0 - 1214 - pts/0 00:00:00 ps
程序的状态是T,表示TASK_STOPPED,进程停止执行:进程没有投入运行也不能投入运行。
而且,这个进程用kill命令是杀死不了的,如下
[root@luqiang total]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 4791 4789 0 80 0 - 1310 - pts/0 00:00:00 bash
0 T 0 4815 4791 0 80 0 - 462 - pts/0 00:00:00 backscanf
4 R 0 4903 4791 0 80 0 - 1214 - pts/0 00:00:00 ps
[root@luqiang total]# kill 4815
[root@luqiang total]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 4791 4789 0 80 0 - 1310 - pts/0 00:00:00 bash
0 T 0 4815 4791 0 80 0 - 462 - pts/0 00:00:00 backscanf
4 R 0 4908 4791 0 80 0 - 1215 - pts/0 00:00:00 ps
[root@luqiang total]#
唯一的终止方式是,
[root@luqiang total]# kill -CONT 4815
[1]+ Terminated ./backscanf
[root@luqiang total]#
这也是网上查来的,原文是:向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。
那这样的,原来那个程序,从开始在后台运行,一直到,接受SIGCONT信号退出,期间的TASK_STOPPED状态,和最后的终止,都是怎么样的状态呢,它应该怎样从标准输入读入内容呢?
|
关于这个APUE有详细解释。后台进程使用terminal会触发信号,导致运行暂停
|
This is from APUE:
#include
unsigned int sleep(unsigned int seconds);
Returns: 0 or number of unslept seconds
This function causes the calling process to be suspended until either
The amount of wall clock time specified by seconds has elapsed.
A signal is caught by the process and the signal handler returns.
As with an alarm signal, the actual return may be at a time later than requested, because of other system activity.
|
sleep应该是指休眠多少真实时间,不是指休眠多少运行时间。因此即使进程已经stop了,真实时间还是流逝了。
|
一般”kill -9 pid“就可以
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。