原文链接:http://os.51cto.com/art/201104/256477.htm

Linux的普通进程(守护进程除外) 是终端的子进程,进程的存在要依赖终端为其提供空间包括标准输入、标准输出、标准出错。比如,在ssh的客户端启动一个连入linux的终端,运行pstree命令,可以看到如下结果:

可以看到pstree相当于当前终端启动的一个子进程。

然后,我们在输入sleep 2000 &命令,让终端启动一个在后台运行的sleep进程,接下来再运行pstreee;

可以看到,启动了一个pid为1354的进程,然后该进程的父进程为sshd,也就是ssh服务启动的终端;

然后,在/proc/1354/fd下,可以看到如下内容:

其中的0、1、2分别指标准输入、标准输出和标准出错,并且它们都指向了/dev/pts/0;

这里的pts是指:pseudo-terminal slave,是虚拟终端的一种实现方式,0是虚拟终端的编号。可以输入ll /dev/pts/看一下结果:

从中可以看出在/dev/pts目录下,一共有3个虚拟终端正在运行。

现在回到虚拟机上的终端界面,也就是X系统上的终端,也在后台运行一个sleep,再进到这个进程所对应的fd目录下,可以看到如下结果:

这里的标准输入、标准输出和标准出错指向了/dev/tty1,tty是真正的终端,pts则是对它的虚拟。

在进程运行过程中(即使是后台运行的进程),当终端退出时,进程将会收到SIGHUP信号,如果程序没有对这种信号进行捕获处理,进程默认就会退出。还以刚才那个在虚拟终端中后台运行的sleep为例:

这是,sleep正在运行是的情况,当我把它的终端关闭后,情况为:

bash少了一个,并且sleep没有了。

因为关闭了一个ssh的虚拟终端,自然会少一个bash,同时在作为该终端子进程的sleep也同时退出了。

那如何让一个程序在终端退出后继续工作呢?

首先一个明确的思路是,可以将要启动的进程的父进程设为init,这样不过当前的终端怎么样,都不会影响进程的运行。可以这样:

setuid ping localhost > /dev/null &

或者

( ping localhost > /dev/null &)

可以看出,ping直接成为init的子进程了。

另外,也可以用nohup命令来实现。

Linux的终端与进程的更多相关文章

  1. 从Linux终端管理进程:10个你必须知道的命令

    从Linux终端管理进程:10个你必须知道的命令 Linux终端有一系列有用的命令.它们可以显示正在运行的进程.杀死进程和改变进程的优先级.本文列举了一些经典传统的命令和一些有用新颖的命令.本文提到的 ...

  2. linux系统编程--守护进程,会话,进程组,终端

    终端: 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中,控制终端是保存在PCB中的信息,而f ...

  3. Linux学习之让进程在后台可靠运行的方法详解

    我们经常会碰到这样的问题,用 telnet/ ssh 登录了远程的 Linux 服务器http://www.maiziedu.com/course/592/,运行了一些耗时较长的任务, 结果却由于网络 ...

  4. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  5. Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸.配图源 ...

  6. Linux 技巧:让进程在后台可靠运行的几种方法(转)

    下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题. nohup/setsid/& 场景: 如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢? ...

  7. Linux高级编程--06.进程概述

    进程控制块 在Linux中,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,它通常包含如下信息: 进程id.系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非 ...

  8. Linux 技巧:让进程在后台可靠运行的几种方法

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

  9. 转: Linux 技巧:让进程在后台可靠运行的几种方法

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

随机推荐

  1. 安装MySQL总结

    由于MySQL的版本不同,所以会有不同的安装方式.在下以Linux系统下MySQL5.1.19版本为例,进行安装,初学还望指正. 一.安装编译软件(简单的yum安装) gcc gcc-c++ ncur ...

  2. Microsoft.DirectX.DirectSound学习(一)

    背景:为什么用到这个类库呢?公司要一个要播放音频文件(.wav)的功能,本来想着很ez的事,网上提供的jq插件.本地也有很多播放器,怎么用都行.可当我实现的时候发现大部分网上插件在火狐上不支持.wav ...

  3. Android 核心组件 Activity 之下

    创建新的Activity的方式: 1. 在相应的文件下 Ctrl + N  (Eclipse, Android中不知道是不是) 2. 创建类,继承自Activity或者Activity的子孙类, 并在 ...

  4. Fedora 17安装NFS

    1.NFS概述 NFS(Network File System)是一种分布式文件系统,允许网络中的安装不同操作系统的计算机间共享文件和外设,所以它的通讯协定设计与主机及作业系统无关. 它是由SUN公司 ...

  5. PowerDesigner 非数值默认值时会自动增加单引单

    在PowerDesigner中,如果默认值是非数值型的,那么 PowerDesigner 会默认加上单引号 因此我们需要把这个默认的单引号干掉,如果是需要设置字符串默认值的时候,就手工加上 单引号 即 ...

  6. go语言使用protobuf

    网上为什么充斥着大量几乎一模一样而且不正确的教程??? 妈的打开一个关于golang和protobuf的教程,无非都是protobuf多么多么牛逼,xml多么多么傻逼,然后就是怎么安装protobuf ...

  7. EXTJS 4.2 资料 控件之Window窗体添加html

    //这里要跳转页面 var subWindow = new Ext.Window({ title: '窗口', width: width, height: height, modal: true,// ...

  8. Sambar,实现Linux和Windows共享

    我下载的是tar的jar包,不是rpm,rpm就不多说了.目的是让Windows能够共享Linux系统的文件夹 1.进入到source文件夹: 2../configure->make->m ...

  9. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...

  10. java程序练习:数组中随机10个数中的最大值

    //定义输入:其实是一个可以保存10个整数的数组 //使用循环遍历,生成10个随机数,放入每个元素中//打桩,数组中的内容 //定义输出变量 //将数组中第一个元素取出,保存在max中,当靶子 //遍 ...