Linux--终端、作业控制、与守护进程
一、进程组,作业,会话的概念
1、进程组:是一个或多个进程的集合。通常,与同一作业相关联,可以接收来自同一终端的各种信号。每个进程都有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与组长进程是否终止无关。
2、作业:Shell分前后台来控制的不是进程而是作业(job)或者进程组。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。
作业与进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业。
一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。
3、会话:是一个或多个进程组的集合。一个会话可以有一个控制终端。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。
****************(进程组就相当于一个班级,组长进程就像当于班长。会话就相当于是一个年级。一个年级有一个教务处。(控制终端))。
二、终端
1、终端的概念:用户通过终端登录系统后得到一个Shell进程,这个终端称为Shell进程的控制终端,
每个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终 端。事实上每个终端设备
都对应一个不同的设备文件,/dev/tty提供了一个通用的接口,一个进程要访问它的控制终端既可以通过/dev/tty也可以通过该终端设备所对应的设备文件来访问。ttyname函数可以由文件描述符查出对应的文件名,该文件描述符必须指向一个终端设备而不能是任意文件。
****************查看一下各种不同的终端所对应的设备文件名。
1 #include<stdio.h> 2 #include<unistd.h> 3 int main() 4 { 5 printf("fd: %d -> %s\n",0,ttyname(0)); 6 printf("fd: %d -> %s\n",1,ttyname(1)); 7 printf("fd: %d -> %s\n",2,ttyname(2)); 8 }
2、终端登录过程:
一台PC通常只有一套键盘和显示器,也就是只有一套终端设备,但是可以通过Ctrl-Alt-F1~Ctrl-Alt- F6切换到6个字符终端,相当于有6套虚拟的终端设备,它们共用同一套物理终端设备,对应的设备 文件分别是/dev/tty1~/dev/tty6,所以称为虚拟终端(Virtual Terminal)。设备文件/dev/tty0表 示当前虚拟终端,比如切换到Ctrl-Alt-F1的字符终端时/dev/tty0就表示/dev/tty1,切换到Ctrl-Alt- F2的字符终端时/dev/tty0就表示/dev/tty2,就像/dev/tty一样也是一个通用的接口,但它不能表示图形终端窗口所对应的终端。
a、系统启动时,init进程根据配置文件/etc/inittab确定需要打开哪些终端。
b、getty根据命令行参数打开终端设备作为它的控制终端,把文件描述符0、1、2都指向控制
终端,然后提示用户输入帐号。用户输入帐号之后,getty的任务就完成了,它再执行login程序:
execle("/bin/login", "login", "-p", username, NULL, envp);
c、login程序提示用户输入密码(输入密码期间关闭终端的回显),然后验证帐号密码的正确性。 如果密码不正确,login进程终止,init会重新fork/exec一个getty进程。如果密码正确,login程序设置一些环境变量,设置当前工作目录为该用户的主目录,然后执行Shell:
execl("/bin/bash", "-bash", NULL);
三、守护进程
1、 守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
2、用ps axj | grep -E 'd$'查看守护进程
参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。
3、创建守护进程
调用函数setsid函数创建一个新的Session,并成为Session Leader(会话首进程),调用成功返回新创建的Session id,出错返回-1;
a、调用umask将文件模式创建屏蔽字设置为0.
b、调用fork,父进程退出(exit)。原因:
1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。
2)保证子进程不是一个进程组的组长进程。
c、调用setsid创建一个新会话。setsid会导致:
1)调用进程成为新会话的首进程。
2)调用进程成为一个进程组的组长进程 。
3)调用进程没有控制终端。(再次fork一次,保证daemon进程,之后不会打开tty设备)
d、将当前工作目录更改为根目录。
e、关闭不在需要的文件描述符。
f、其他:忽略SIGCHLD信号。
#include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 void mydeamon(void) 5 { 6 pid_t id=fork(); 7 umask(0);//将文件模式创建屏蔽字设置为0. 8 if(id>0) 9 { 10 exit(0);//调用fork,父进程退出(exit) 11 } 12 setsid();//调用setsid创建一个新会话 13 chdir("/");//将当前工作目录更改为根目录。 14 close(0);//关闭不在需要的文件描述符。 15 close(1); 16 close(2); 17 } 18 int main() 19 { 20 mydeamon(); 21 while(1); 22 return 0; 23 }
用ps axj |grep "文件名"查看刚才创建的守护进程
以上就是Linux--终端、作业控制、与守护进程的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

如今,Ubuntu不允许其用户打开终端是一个非常普遍的问题。如果您收到类似的问题并且不知道下一步该怎么做,请了解有关如何在Linux设备上解决此“Ubuntu无法打开终端”问题的五个修复程序。事不宜迟,让我们深入探讨导致它的原因及其可用的解决方案。为什么Ubuntu打不开它上面的终端?这主要发生在您安装一些有缺陷的软件或修改终端配置时。除此之外,与语言环境交互并破坏它们的新应用程序或游戏也可能导致类似的问题。一些用户在Ubuntu的活动菜单中搜索终端时报告修复了这个问题。这表明这个

win7系统内置超级终端这个通信作用,客户能通过这个功能去连接到其他的计算机。那么win7超级终端如何打开呢?你先打开控制面板,找到电话和调制调解器,以后设定位置信息,以后打开hypertrm.exe程序,在弹出页面中输入名字即可,如果存在多个连接还能够根据新建去继续添加,最终输入IP地址就能够连接了。win7超级终端如何打开:1、最先要在控制面板中设定,开始→控制面板→电话和调制调解器2、打开位置信息→挑选国别、区号、电话等相关信息→确定3、双击打开hypertrm.exe程序,会有一个是否默

随着Linux操作系统的广泛应用,越来越多的人开始需要学习和了解Linux系统中的基本命令和快捷方式。在本文中,我们将介绍一些常用的Linux命令和快捷方式,帮助初学者了解Linux系统,提高工作效率。常用命令1.1ls命令ls命令是Linux中最常用的命令之一。它主要用于列出当前目录下的文件和子目录。常用的选项有:-l:以长格式显示文件信息,包括文件类型

Linux终端乱码问题的处理方法在使用Linux系统时,有时候在终端中显示的文字会出现乱码,这给我们使用终端带来了不便,需要及时处理。本文将为大家介绍一些常见的Linux终端乱码问题的处理方法,同时提供具体的代码示例。问题一:终端中文乱码终端中文乱码通常是由于终端的字符编码设置不正确导致的。我们可以通过修改终端的字符编码设置来解决这个问题。#查看当前终端的

Python是一门非常流行的编程语言,尤其在网络编程方面有着广泛的应用。服务器端的编程也是其中之一。在服务器端编程中,守护进程是一个常见的概念。本篇文章介绍Python服务器编程中实现守护进程的方式。什么是守护进程在服务器端程序运行的过程中,为了保证程序长期稳定的运行,我们需要将其转化为守护进程。守护进程是一种在后台持续运行的进程,该进程不会占用控制台或登录

vscode打开终端窗口的步骤:1、通过快捷键打开终端窗口;2、通过菜单栏打开终端窗口;3、通过命令面板打开终端窗口;4、修改默认终端;5、使用终端窗口。

微软近日推出了VisualStudioCode1.80,虽然本次更新于7月发布,官方依然将其称之为6月更新。用户安装本次更新之后,内置终端可以直接显示图片,此外还优化了辅助功能。VisualStudioCode此前发布的预览版中,已支持在终端中支持图像,而在新的1.80版本中默认为启用状态。为了能够在终端中可以显示图像,图像像素数据再通过特殊的转义序列转换为文本,最终写入终端。如果要将典型的PNG,GIF或JPEG文件传递到终端,则需要安装imgcatpython软件包,然后在终端中运行imgc

linux的终端默认在“/bin”目录下,打开linux终端的方法有:1、在linux的首页使用“Ctrl+alt+T”打开终端;2、通过“search your computer”功能搜索,输入“ter”打开terminal终端,然后通过“Ctrl+d”关闭终端即可。
