Linux系统编程(会话和进程)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Linux系统编程(会话和进程)

前言

本篇文章我们来讲解会话和进程的概念,会话大家可能比较少见,他的英文名称叫session。

一、会话的概念

Linux中,会话(Session)是指用户与操作系统交互的一段时间。Linux下的会话概念是基于终端(Terminal)的,而终端可以是物理终端、虚拟终端(例如TTY)或远程连接(如SSH)。

以下是Linux中会话的几个关键概念:

1.控制终端:

在一个会话中,通常会存在一个控制终端,为用户提供输入和输出的交互界面。用户通过控制终端与操作系统进行交互,包括输入命令、运行程序和查看输出。

2.终端会话:

一个用户可以在控制终端上启动一个或多个终端会话。每个终端会话都是一个独立的进程组,包含一个前台进程组和零个或多个后台进程组。

3.前台进程组:

前台进程组是当前用户正在交互的进程组。当用户从控制终端输入命令时,命令将发送给前台进程组的前台进程进行处理。只有一个进程组可以处于前台状态。

4.后台进程组:

后台进程组是在终端会话中运行的进程组,但没有用户输入交互。用户可以将进程从前台切换到后台,使其在后台运行而不阻塞终端。

5.会话管理程序:

Linux通过会话管理程序(session manager)来管理终端会话。会话管理程序负责创建和管理会话,设置控制终端,并在会话结束时清理资源。

6.会话注销和断开:

当用户注销或断开与终端的连接时,会话通常会终止。会话终止会导致终端上的所有进程(前台和后台)收到相应的信号来进行清理和终止。

会话在Linux中是重要的概念,它提供了用户与操作系统之间的交互环境,并管理用户的进程组。了解和理解Linux中的会话概念对于正确地管理和控制用户的交互行为是至关重要的。

二、会话和终端的区别

会话(Session)和终端(Terminal)是两个相关但不完全相同的概念。

会话是指用户与操作系统或应用程序之间的交互过程,涉及到用户的身份验证、持久性连接、状态保持等方面。在会话中,用户可以通过终端或其他交互方式与系统进行通信。

终端是一个提供用户与计算机交互的设备或界面,用户可以通过终端输入命令、查看输出和与系统进行交互。终端可以是物理设备(如物理终端设备、控制台)或虚拟设备(如虚拟终端、SSH连接)。终端提供了用户与系统之间的输入和输出通道。

下面是它们之间的区别:

1.概念层面:

会话是指用户与操作系统或应用程序之间的交互过程,包括用户的身份验证、持久性连接和状态保持等。

终端是用户与计算机交互的设备或界面,它提供了用户输入和输出的通道。

2.关联:

会话和终端通常是相关的。一个用户可以通过终端设备或虚拟终端启动一个会话,并在会话中与系统进行交互。

一个终端可以有多个会话,例如在同一终端设备上打开多个虚拟终端会话。

3.功能:

会话涉及用户的身份验证、状态保持和持久性连接等功能,用于管理用户与系统之间的交互。

终端提供了用户输入命令、查看输出和与系统进行交互的功能。

4.物理性质:

会话是一个抽象的概念,表示用户与系统的交互过程,不涉及具体的物理设备。

终端可以是物理设备(如键盘、显示器)或虚拟设备(如虚拟终端、SSH连接)。

当命令行shell执行新的命令创建出新的进程时:

使用&创建新的进程,新建的进程是后台进程,自己依然是前台进程。

不使用&创建新的进程,新建的进程是前台进程,自己被设置为后台进程。

三、终端进程组标识

在Linux中,每个终端会话都有一个唯一的进程组标识符(Process Group ID,PGID)。终端进程组标识是为了实现作业控制和进程管理而引入的。

每个终端会话中的进程都隶属于一个进程组。当用户在终端上启动一个新的进程时,默认情况下,该进程会被分配到同一终端会话的进程组中。

终端进程组标识具有以下特点:

1.会话首进程的进程组标识:

在每个会话中,会有一个会话首进程(session leader)创建该会话,会话首进程的进程组标识与会话ID(Session ID,SID)相同。

2.前台进程组:

在终端会话中,只能有一个前台进程组(foreground process group)。该前台进程组通常接收来自终端的用户输入,并将输出发送到终端。用户在终端上输入的命令会被发送给前台进程组中的前台进程。

3.后台进程组:

终端会话可以同时包含多个后台进程组(background process group)。后台进程组是在终端会话中运行的进程组,但不接受用户输入。后台进程组可以在终端会话运行而不阻塞终端。

通过使用终端进程组标识,系统可以实现对作业控制的管理,包括在前台或后台运行进程组、切换前后台进程组、发送信号等。

要查看当前终端进程组标识,您可以使用echo $$命令。该命令会输出当前Shell进程的进程ID(PID),该Shell进程所在的进程组ID就是终端进程组标识。

四、创建会话

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
    pid_t pid;
    // 创建一个子进程
    pid = fork();
    if (pid < 0) {
        fprintf(stderr, "无法创建子进程\n");
        return 1;
    } else if (pid == 0) {
        // 子进程
        // 创建一个新的会话
        if (setsid() < 0) {
            fprintf(stderr, "无法创建新会话\n");
            return 1;
        }
        // 关闭标准输入、输出和错误输出
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
        // 从这里开始,子进程就可以执行会话中的任务
        // 示例:打开一个日志文件并写入日志
        FILE* logFile = fopen("/var/log/mylog.txt", "w");
        if (logFile == NULL) {
            fprintf(stderr, "无法打开日志文件\n");
            return 1;
        }
        fprintf(logFile, "会话已启动\n");
        fprintf(logFile, "执行一些任务\n");
        // 关闭日志文件
        fclose(logFile);
        // 子进程完成任务后退出
        exit(0);
    } else {
        // 父进程
        // 这里可以选择等待子进程完成或继续执行其他任务
        printf("子进程的PID:%d\n", pid);
    }
    return 0;
}

这个示例程序创建了一个子进程,子进程通过调用setsid()函数创建一个新的会话,然后关闭标准输入、输出和错误输出,开始执行会话中的任务(这里仅为示例,可以根据具体需求进行修改)。父进程可以选择等待子进程完成或继续执行其他任务。

总结

本篇文章就讲解到这里。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
15
分享
相关文章
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
67 27
|
9天前
|
Linux系统ext4磁盘扩容实践指南
这个过程就像是给你的房子建一个新的储物间。你需要先找到空地(创建新的分区),然后建造储物间(格式化为ext4文件系统),最后将储物间添加到你的房子中(将新的分区添加到文件系统中)。完成这些步骤后,你就有了一个更大的储物空间。
61 10
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
2月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
105 24
Linux系统之whereis命令的基本使用
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
69 17
|
21天前
|
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
61 8
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
|
30天前
|
Linux:守护进程(进程组、会话和守护进程)
守护进程在 Linux 系统中扮演着重要角色,通过后台执行关键任务和服务,确保系统的稳定运行。理解进程组和会话的概念,是正确创建和管理守护进程的基础。使用现代的 `systemd` 或传统的 `init.d` 方法,可以有效地管理守护进程,提升系统的可靠性和可维护性。希望本文能帮助读者深入理解并掌握 Linux 守护进程的相关知识。
42 7
|
29天前
|
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
49 5
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。