当前位置:  技术问答>linux和unix

脑洞大开,让一个带标准输入的程序在后台运行会怎样呢

    来源: 互联网  发布时间:2017-05-25

    本文导语:  今天练习套接字编程,无意间让一个需要标准输入的客户程序后台运行了,然后,就根本停不下来了~ 先不说套接字编程里面各种TCP状态的转移,就拿一个最简单的输入输出程序来说吧。 #include  #include  int main(void)...

今天练习套接字编程,无意间让一个需要标准输入的客户程序后台运行了,然后,就根本停不下来了~
先不说套接字编程里面各种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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我按书上的例子写了一个大开文件对话框,发现有一个问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3