Linux进程解析

Unity机械拆装实战:5步搞定发动机模型交互式装配(附完整代码) 本文详细介绍了在Unity中实现高交互性机械拆装仿真的完整流程。以发动机模型为例,通过5个核心步骤:项目初始化与模型准备、核心交互实现、智能装配逻辑、场景管理与相机控制、进阶优化与扩展,系统讲解了从零构建交互式装配功能的方法,并提供了完整的代码示例。 阅读详情

进程

进程标识

进程有很多的ID标识,如:

1.

进程ID和父进程ID
#include <unistd.h>
pid_t getpid(void); //获得当前进程ID
pid_t getppid(void); //获得父进程ID

2.

一个进程有真实用户ID和真实组ID,也有有效用户ID和有效组ID
有效ID的作用:比如,一个进程是root权限运行的,真实ID为root。这个进程却要用普通身份创建一个文件,通过将进程的有效ID设置为这个普通用户的ID,进程就能创建“好像是”那个用户创建的文件了。
#include <unistd.h>
gid_t getgid(void); //真实组ID
uid_t getuid(void); //真实用户ID
gid_t getegid(void); //有效组ID
uid_t geteuid(void); //有效用户ID

进程状态


一个 简单系统的状态

ps工具用来显示有关进程的信息。默认情况下,ps显示与用户有关的进程信息。-a显示与终端有关进程的信息,-A显示所有进程的信息,-o用来指定输出的格式。
ps [-aA] [-G grouplist] [-o format] ... [-p proclist]
[-t termlist] [-U userlist]


进程的创建

进程可以通过调用fork() 来创建进程。fork()可以拷贝父进程中的内存映像,子进程进行和父进程没有任何关系,只会在进程结束时,返回一个pid给父进程。

执行如下程序时,会发生什么情况?

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t childpid;
    pid_t mypid;

    mypid = getpid();
    childpid = fork();
    if (childpid == -1)
    {
        prror("Failed to fork");
        return 1;
    }

    if(childpid == 0)
    {
        printf("I am child %ld, ID = %ld\n", (long)getpid(), (long)mypid);
    }
    else
    {
        printf("I am parent %ld, ID = %ld\n", (long)getpid(), (long)mypid);
    }
    return 0;
} 

进程的阻塞状态

一个进程创建子进程时,父进程和子进程都从fork后的那个点开始继续执行。父进程可以通过wait或waitpid一直阻塞到子进程结束。wait函数会使用调用者的执行挂起,直到子进程的状态成为可用的,或调用者收到一个信号为止。
#include <sys/wait.h>
pid_t wait(int *stat_loc); //获得pid
pid_t waitpid(pid_t pid, int *stat_loc, int options); //获得pid
wait或waitpid的参数stat_loc是一个指向整数变量的指针。如果stat_loc不为NULL,这些函数就将子进程的返回状态存储在这个单元中。子进程通过exit、_exit、_Exit或从main函数中return来返回它的状态。

进程exec函数

fork()函数创建了调用进程的一份拷贝,但很多应用程序都需要子进程与其父进程不同代码。
exec函数族提供了用新的映射来覆盖调用进程的进程映射的功能。fork-exec配合应用的传统方法是:子进程执行新程序,而父进程继续执行原来的代码。
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg0, .../* char * (0)*/ );
int execle(const char *path, const char *arg0,... /* char * (0) , char *const envp[] */ );
int execlp(const char *file, const char *arg0, ... /* char *(0) */);
int execv(const char *path,char *const argv[] );
int execve(const char *path,char *const argv[] , char *const envp[]);
int execvp(const char *path,char *const argv[] );
调用exec后保留的属性 and 与这些属性相关的一些库函数
进程ID getpid
父进程ID getppid
进程组ID getgid
serssionID getsid
真实组ID getgid
真实用户ID getuid
有效组ID getegid
有效用户ID geteuid
附加组ID getgroups
告警信号剩余时间 alarm
当前工作目录 getcwd
根目录
文件形式的创建掩码 umask
进程信号掩码 sigprocmask


后台进程和守护进程

守护进程是一种可以无限期进行的后台进程。unix操作系统是由很多的守护进程来维持稳定的。
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。
创建子进程,父进程退出。这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离。

在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程时,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。
在子进程中创建新会话这个步骤是创建守护进程中最重要的一步,虽然它的实现非常简单,但它的意义却非常重大。在这里使用的是系统函数setsid,在具体介绍setsid之前,首先要了解两个概念:进程组和会话周期
进程组:是一个或多个进程的集合。进程组有进程组ID来唯一标识。除了进程号(PID)之外,进程组ID也是一个进程的必备属性。每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。且该进程组ID不会因组长进程的退出而受到影响。
会话周期:会话期是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。
接下来就可以具体介绍setsid的相关内容:
setsid函数作用:
setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid有下面的3个作用:
让进程摆脱原会话的控制
让进程摆脱原进程组的控制
让进程摆脱原控制终端的控制
那么,在创建守护进程时为什么要调用setsid函数呢?由于创建守护进程的第一步调用了fork函数来创建子进程,再将父进程退出。由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。
改变当前目录为根目录这一步也是必要的步骤

使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。因此,通常的做法是让"/"作为守护进程的当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp。改变工作目录的常见函数是chdir。
重设文件权限掩码
文件权限掩码是指屏蔽掉文件权限中的对应位。比如,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限。由于使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性。设置文件权限掩码的函数是umask。在这里,通常的使用方法为umask(0)。
关闭文件描述符
同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。
在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。通常按如下方式关闭文件描述符:
===============================
for(i=0;i<MAXFILE;i++)
close(i);
===============================
守护进程退出处理
当用户需要外部停止守护进程运行时,往往会使用 kill命令停止该守护进程。所以,守护进程中需要
编码来实现kill发出的signal信号处理,达到进程的正常退出。
===============================
signal(SIGTERM, sigterm_handler);
void sigterm_handler(int arg)
{
_running = 0;
}
===============================
这样,一个简单的守护进程就建立起来了。
实现守护进程的完整实例(每隔10ms在/tmp/dameon.log中写入一句话):
=====================================================================

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/stat.h>

#define MAXFILE 65535

void sigterm_handler(int arg);
volatile sig_atomic_t _running = 1;

int main()
{
    pid_t pc,pid;
    int i,fd,len,flag = 1;
    char *buf="this is a Dameon\n";
    len = strlen(buf);
    pc = fork(); //第一步
    if(pc<0)
    {
        printf("error fork\n");
        exit(1);
    }
    else if(pc>0)
    exit(0);
    pid = setsid(); //第二步
    if (pid < 0)
    perror("setsid error");
    chdir("/"); //第三步
    umask(0); //第四步
    for(i=0;i<MAXFILE;i++) //第五步
    close(i);
    signal(SIGTERM, sigterm_handler);
    while( _running )
    {
        if( flag ==1 &&(fd=open("/tmp/daemon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)
        {
            perror("open");
            flag=0;
            exit(1);
        }
        write(fd,buf,len);
        close(fd);
        usleep(10*1000); //10毫秒
  }
}
void sigterm_handler(int arg)
{
    _running = 0;
}


linux守护进程列表

amd:自动安装NFS(网络文件系统)守侯进程
apmd:高级电源治理
Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和ip地址对数据库
Autofs:自动安装治理进程automount,与NFS相关,依靠于NIS
crond:linux下的计划任务
Dhcpd:启动一个DHCP(动态IP地址分配)服务器

Gated:网关路由守候进程,使用动态的OSPF路由选择协议

Httpd:WEB服务器
Inetd:支持多种 网络服务 的核心守候程序
Innd:Usenet新闻服务器
Linuxconf:答应使用本地WEB服务器作为 用户接口 来配置机器
Lpd: 打印服务器
Mars-nwe:mars-nwe文件和用于Novell的打印服务器
Mcserv:Midnight命令 文件服务器
named:DNS服务器
netfs:安装NFS、Samba和NetWare 网络文件系统
network:激活已配置网络接口的 脚本程序
nfs:打开NFS服务
nscd:nscd(Name Switch Cache daemon)服务器,用于NIS的一个支持服务,它高速缓存用户口令和组成成员关系
portmap:RPC portmap治理器,与inetd类似,它治理基于RPC服务的连接
postgresql:一种SQL 数据库服务器
routed:路由守候进程,使用动态RIP 路由选择协议
rstatd:一个为LAN上的其它机器收集和提供系统信息的守候程序
ruserd: 远程用户 定位服务,这是一个基于RPC的服务,它提供关于当前记录到LAN上一个机器日志中的用户信息
rwalld:激活rpc.rwall服务进程,这是一项基于RPC的服务,答应用户给每个注册到LAN机器上的其他终端写消息
rwho d:激活rwhod服务进程,它支持LAN的rwho和ruptime服务
sendmail: 邮件服务器 sendmail
smb:Samba文件共享/打印服务
snmpd:本地简单网络治理候进程
squid:激活代理服务器squid
syslog:一个让系统引导时起动syslog和klogd 系统日志 守候进程的脚本
xfs:X Window字型服务器,为本地和远程X服务器提供字型集
xntpd:网络时间服务器
ypbind:为NIS(网络信息系统)客户机激活ypbind服务进程
yppasswdd:NIS口令服务器
ypserv:NIS主服务器
gpm:管鼠标的
identd:AUTH服务,在提供用户信息方面与finger类似

Bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息





解放双手!利用海康VM全局脚本+通讯管理打造自动化视觉控制系统 本文深入探讨了如何利用海康VisionMaster(VM)的全局脚本和通讯管理功能,打造高效自动化视觉控制系统。通过全局变量实现数据共享与动态调整,结合多协议通讯管理,提升系统响应速度与智能化水平,适用于工业4.0环境下的复杂视觉检测与决策场景。 阅读详情

相关推荐

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

总结WRF运行时报错及解决方案(持续更新)

WW、forever的博客 1586

AIX系统管理常用命令

问题: 在系统的使用中,有时需要使用no命令调整相应的网络参数值。调整完成后新的值会马上生效,但是系统重新启动后这些值又会恢复到缺省值。如何设置使它们在系统重启后仍为重启前调整的值? 解答: 在AIX 5.2以前的操作系统版本中,需要将相应的no命令加入/etc/rc.net文件,如,编辑/etc/rc.net文件,加入如下一行: /usr/sbin/no -o tcp_sendspa

小二 3014

Codex入门00-初识神器(小白入门:到底什么是Codex CLI,和ChatGPT写代码有什么不同?)

OpenAI Codex CLI 是 OpenAI 于2025年推出的终端原生AI编程代理,不是在网页里聊天写代码,而是直接在你的终端里自主读代码、改文件、跑命令。它拥有三种安全模式、/goal 持久化任务、云端沙箱执行等独特能力。本文从零介绍 Codex CLI 的核心概念、与 ChatGPT 写代码的本质区别、典型使用场景和费用说明,让你全面认识这个改变开发方式的神器。

yueyeguzhuo的专栏 253

gated 守护进程

gated 守护进程 用途 为 RIP、RIPng、EGP、BGP、BGP4+、HELLO、IS-IS、ICMP、ICMPv6 和 SNMP 协议提供网关路由功能。 注:从命令行用 SRC 命令来控制gated...

cilm15461的博客 140

Linux 执行新程序:execve() 函数

系统调用execve()函数作用在Linux程序中,通过调用execve(),进程能够以全新程序来替换当前运行的程序。再次过程中,将丢弃旧有程序,进程的栈.数据以及堆段会被新程序所替换。这个 exec 函数族就提供了一个在进程中启动另一个程序执行的方法。 它根据指定的文件名或目录名找到可执行文件,并用它来代替当前进程的执行映像。也就是说,exec调用并没有生成新进程,一个进程一旦调用 ex

GeneralSandman的博客 1万+

Linux 进程

一、进程1、什么是进程    当运行任何一个UNIX命令时,shell至少会建立一个进程来运行这个命令,所以可以把任何在UNIX系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程可以并发的调用同一个程序。    系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示

xjh_Love_paopao的专栏 1418

linux下关于execve函数的简单解析

execve(执行文件) 在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。

matrixa17的专栏 1756

深入解析 Linux 进程管理

深入学习进程相关知识,包括概念、状态、创建、特殊进程情况、调度、优先级、特性以及环境变量与相关指令、函数等。

Edison's 小宇宙 7万+

Linux进程详细解析

基本概念与基本操作 课本概念:程序的⼀个执行实例,正在执行的程序等 内核观点:担当分配系统资源(CPU时间,内存)的实体。 描述进程-PCB 进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct 。task_struct-PCB的⼀种 在Linux中描述进程的结构体叫做task_struct。 

hyxdg的博客 980

LinuxLinux进程状态深度解析

进程状态是操作系统内核对进程当前活动与执行状态的描述,是内核调度资源的管理依据。它既反映进程的实时状态(如是否在使用 CPU、是否等待硬件 / 文件资源、是否被暂停),也帮助内核判断如何高效分配 CPU 等系统资源,是进程管理的核心基础之一。

2402_86350387的博客 2280

Linux】深度解析Linux中的几种进程状态

一.Linux进程状态1.Linux进程状态在kernel源代码里的定义2.S :浅度睡眠状态1.S状态与S+状态3.D :磁盘休眠状态 / 深度睡眠状态4.T :停止状态(阻塞状态)4.1 t :追踪停止状态5. X :死亡状态6. Z :僵尸状态(Linux特有状态)1)僵尸进程的危害2)孤儿进程的引入

YYDsis的博客 1323

Linux 进程管理的全面解析

进程是操作系统中最基本的概念之一,它是程序在计算机上的一次执行过程。资源分配的基本单位:操作系统以进程为单位分配系统资源(CPU时间、内存、I/O设备等)独立的内存空间:每个进程拥有自己独立的虚拟地址空间,进程间相互隔离生命周期:进程有明确的创建、执行、等待和终止等状态变化程序与进程的关系:程序是静态的代码文件,进程是程序运行的动态实例进程的特点包括:并发性:多个进程可以并发执行动态性:进程是执行中的程序,有生命周期独立性:各进程拥有独立的地址空间和资源。

fenghell99的博客 621

重温Linux-5.Linux系统所提供的服务

重温Linux-5.Linux系统所提供的服务所有的Linux系统,都提供了一个共同的抽象和接口的集合。Unix的核心内容包括文件和进程的抽象、管道和套接字管理的接口等等。 文件和文件系统Linux遵循一切皆是文件的理念(虽然并不是像某些系统严格)。文件是Linux中最基本和重要的抽象。 在系统编程中,文件必须被打开才能被访问。 文件可以以只读方式或者只写方式打开,或者两者皆有。

cslqm 1108

Linux文件系统基础知识

Linux文件系统基础知识   一切皆文件。 是什么        linux文件系统是linux系统的一个组成部分,它是由一组软件构成的,用于组织文件在硬盘等存储空间上的存放、读取、修改等或设备(如打印机、光驱等)的访问。linux可以读写100多种磁盘管理模式,如,FAT、FAT32、NTFS、Ext2、Ext3、Ext4,这些都需要有相应的软件支持,这些软件就统称为“l

cslqm 1008

重温Linux-3.文件操作

重温Linux-2.文件操作重温Linux-2文件操作 文件操作常用指令 ls命令 pwd命令 mkdir命令 rmdir命令 touch命令 rm命令 ln命令 cp命令 mv命令 文件和文件名 Linux命名规则 文件类型 常见目录 工作目录和用户主目录文件操作常用指令 ls pwd mkdir rmdir touch rm ln cp mv

cslqm 743

Linux 用户 用户组权限管理

Linux 用户 用户组权限管理 adduser man adduser  [options]  [--home  DIR]  [--shell  SHELL]  [--no-create-home]        [--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid  ID]        [--d

cslqm 720

重温Linux-4.Vi使用

重温Linux-4.Vi使用什么是ViVi,是一款由加州大学伯克利分校,Bill Joy 研究开发的文本编辑器。 由加州大学伯克利分校,Bill Joy 研究开发。Vi的三种模式

cslqm 642

重温Linux-1.Linux操作系统

重温Linux-1.Linux操作系统 什么是操作系统?         操作系统是管理计算机硬件,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计算机系统的关键的组成部分,负责管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等 基本任务。         操作系统的种类很多,各种设备安装的操作系统可从简单到复杂,可从手机的嵌入式操

cslqm 595

重温Linux-2.Linux常用命令

重温Linux-2.Linux常用命令

cslqm 590

make与Makefile

Makefile 包含了所有的规则和目标,而 make 则是为了完成目标而去解释 Makefile 规则的工具 make语法 make [ -f makefile ] [ options ] … [ targets ] … 前期准备 无论是c/c++都是由源文件编译为目标文件,Windows上.obj,UNIX上.o文件,即Object File文件。然后再把大量的Object Fil...

cslqm 496

linux下的nm指令

使用指令: g++ -c hello.c -o hello.o(没错,就是用c++编译器编译c文件),将hello.c编译成目标文件hello.o文件。然后使用nm指令查看hello.o文件的符号表。是 Linux 下一个非常常用的查看目标文件/可执行文件符号表(symbol table)的命令。

xinxin的博客 252

耳机基础知识

耳机基础知识,AES上的一篇关于耳机的基础知识的文档,都是耳机的基础知识但是是英文版的

创维8R96机芯 E660E系列 主程序软件 电视刷机 固件升级包 V014.002.250

本升级包只支持8R96机芯的E660E,如果本地升级找不到升级包,说明您的机芯不是8R96的,请不要升级。升级包名:8R96_E660E-img_V014.002.250.zip版本:014.002.250_3.2.2下载完拷贝到U盘(不可使用读卡器、移动硬盘等),无需解压。进入:“主页-设置-系统设置-系统更新-本地升级”选择确定即可。系统会重启进入升级模式,蓝色背景进度条,升级过程会有10分钟左右,升级完会自动重启;注意事项:1、请务必使用FAT32格式的U盘升级,否则会升级不成功!2、本次升级将清空您的所有数据:设置、安装的应用及应用数据等!

上一篇: Linux getspnam、getspent、setspent和endspent函数
下一篇: Linux 进程资源限制 getrlimit和setrlimit函数
cslqm
博客等级 码龄11年 32粉丝 92原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值