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日志并进行多维度分析。
相关文章
|
15天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
39 1
|
3天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
110 78
|
7天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
36 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
3天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
38 13
|
10天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
18天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
4天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
16 0
|
15天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
下一篇
DataWorks