linux下进程的一些总结

Linux进程——进程退出 线程。 阅读详情

      引用《linux程序设计》的一句话:进程和信号构成了Linux操作环境的基础部分,控制着Linux和其他所有类UNIX计算机系统执行的几乎所有动作。(哇,这么高端, 其实算来,windows下,貌似也是进程,不过信号有没有这么重要的作用就不知道了,不过windows下应该是消息)

 一、什么是进程

      说到进程,其实在操作系统这门课就讲过,也就是正在执行的程序(当然,这定义太简单了)。UNIX标准将进程定义为:一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。目前,先将进程看做正在运行的程序。

       需要说的是,Linux高效性的一个地方在于,系统会在进程间共享程序代码和系统函数库,所以在任一时刻,内存中都只有代码的一份副本!

二、进程的管理

        如果有2个用户neil和rick,他们同时运行grep在不同文件中查找不同字符串,则使用的进程如下图所示:

       

        进程的关键要素,PID这个直接调用getpid()就可以得到,取值2到32768(1呢?给init进程了啊)

        正常情况下,进程不能对用来存放代码的内存区域进行写操作,即代码是以只读方式加载到内存的。虽然不能写,不过可以被多个进程安全的共享。可以共享的不知是用户函数,系统函数也可以,共享的思想,类似于windows下的.dll机制。不过不是所有东西都可以共享,进程的变量就不行。(其实说到共享,想到在unix环境下,进程通信貌似是很重要的部分呢么)

         另外,进程还有自己的栈空间,用于保存函数中的局部变量和控制函数的调用与返回。进程还有自己的环境空间,包含专门为这个进程建立的环境变量(其实对于这个不是很理解)

三、启动进程以及linux的启动

        启动进程,我们可以用system函数(其实以前看过还可以fork什么的,后面上)。system原型为:

#include <stdlib.h>
int system(const char *string);
      以前经常用system("cls")和pause什么的,system的作用就是运行以字符串参数的形式传递给它的命令并等待该命令的完成。

      linux的启动过程呢,可以参考http://www.ibm.com/developerworks/cn/linux/kernel/startup/,不过这个略高深了点。单从进程的启动过程来讲,启动过程就是,首先启动init进程(pid=1)可以把它看做整个系统的进程管理器,或者看做祖先进程。然后init来处理系统的初始化,(主要是rc.sysinit)处理完后,回到init,启动系统服务和设置文件。下面终于到我们熟悉的终端和x-window界面了。(可参考:http://www.cnblogs.com/scnutiger/archive/2009/09/30/1576795.html)

四、exec(),fork(),wait()僵尸进程

        突然想起,在kismet的源代码中见过exec()和fork(),不过对这俩印象不是很深刻,下面来学习一下吧。

1、  exec():替换进程映像。exec家族函数:

#include <unistd.h>

char **environ;

int execl(const char *path, const char *arg0, ... ,(char *)0);
int execlp(const char *file, const char *arg0, ...,(char *)0);
int execle(const char *path, const char *arg, ...,(char *)0,char *const envp[]) ;
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
        这些函数可以分为2大类。execl、execlp和execle的参数个数可变,参数以一个空指针结束;execv和execvp的第二个参数是一个字符串数组(和main的命令行参数一样)。不管哪种情况,新程序启动时会把argv数组中的参数传递给main函数。

        p结尾的函数是通过搜索PATH环境变量来查找新程序的可执行文件的路径,如可执行文件不在PATH定义路径中,我们就需要把包括目录在内的使用绝对路径的文件名作为参数传递。

         environ为全局变量,可用来把一个值传递到新的程序环境中。此外,函数execle和execve可以通过envp传递字符串数组作为新程序的环境变量。         

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("Running ps with execlp \n");
	execlp("ps","ps","ax",0);
	printf("Done .\n");
	exit(0);
}
    运行以上程序,有正常的ps输出,却没有done的输出,另外,ps的输出中,没有exec进程(本程序可执行名)的任何信息。
2、fork():复制进程映像

       关于fork(),http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html有提到,不过个人更喜欢http://blog.youkuaiyun.com/lingdxuyan/article/details/4993883,毕竟,fork出来的进程,说父子程序,其实也可以说兄弟程序。fork过程示意图:


      fork()函数原型:

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

pid_t fork(void);
     关于fork,需要注意的几个点就是:

     a.fork是对当前父进程的复制,包括代码段,数据段,堆栈段。说是复制,其实这里用共享更合适,如http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html所讲,fork对于父子进程的划分,只是逻辑上,不是物理上,只有数据改变时,才物理上进行划分。不过不精确,因为共享的,显然只能是代码段,数据必然是进程所独有的,堆栈也只能的记录fork那个时刻的堆栈情况。所以虽然子进程继承了父进程的大部分资源,不过只是父进程在fork那个时刻的数据,在fork以后,数据段就分开了,要进行共享,只能进程通信实现。

     b.父子进程的pid,对子进程是0,对父进程在而是一个正整数。

     示范程序如下:

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

int main()
{
	pid_t  pid;
	char *message;
	int n;

	printf("fork program starting ...\n");
	pid = fork();
	switch (pid)
	{
	case -1:
		perror("fork failed!");
		exit(1);
	case 0:
		message = "This is the child ";
		n = 5;
		break;
	default:
		message = "This is the parent" ;
		n = 3 ;
		break;
	}
	for ( ; n > 0 ; i-- )
	{
		puts(message);
		sleep(1);
	}
	exit(0);
}
       这个程序以2个进程的形式存在,子进程被创建并输出5次,父进程只输出3次。父进程在打印完它的全部消息后接受,因此我们能看到在输出内容中混杂了一个shell提示符(从这还是能看出是父子关系啊)结果如下:

3、wait():等待一个进程
      上一个示例,父进程在子进程结束之前结束了,不过子进程还在继续运行,得到的输出就有点乱了,我们可以通过在父进程中调用wait函数让父进程来等待子进程的结束。          wait()函数原型如下:

#include <sys/types.h>
#include <sys/wait.h>

pid_t  wait(int *stat_loc);
       wait调用的作用,暂停父进程直到它的子进程结束为止,调用返回子进程的pid,通常是已经结束的子进程的pid。对上面fork的例子,我们可以加上如下一段来等待子进程的完成。
	if (pid != 0)
	{
		int stat_val;
		pid_t child_pid;
		child_pid = wait(&stat_val);
		printf("Child has finished : PID = %d\n",child_pid);
		if (WIFEXITED(stat_val))
			printf("Child exited with code %d \n",WEXITSTATUS(stat_val) );
		else
			printf("Child terminated abnormally \n");
	}
运行结果如下:


     在上面的代码中,父进程用wait调用将自己的执行挂起,直到子进程的状态信息出现为止(在子进程调用exit时发生)。

4、僵尸进程

      用fork产生进程时,还有一个问题,子进程终止时,它与父进程之间的关联还会保持,直到父进程也正常终止或父进程调用wait才结束。因此,进程表中代表子进程的表项不会立即释放,虽然子进程已不再运行,但它仍存在于系统中,因为它的退出码还需要保存起来,以备父进程今后的wait调用,这时候,它就成为了一个僵尸zombie进程。

     对上面的fork示例,我们兑换父子进程的n值,就可以看到僵尸进程了。(在子进程结束后,父进程结束之前调用ps,我们会看到<defunct>或者<zombie>)lz的f9看到的是 如下情况:


      如果此时父进程异常终止,子进程自动把PID为1的进程(即init)作为自己的父进程。这样,如果异常终止的过多,init接管的就越多,僵尸进程一直保留在进程表中,直到被init发现并释放。表越大,过程就越慢,所以应该尽量避免僵尸进程产生。

       僵尸进程的回收,可以用wait来实现,具体可以参考:http://linux.chinaitlab.com/c/831518.html


      另外http://blog.youkuaiyun.com/lingdxuyan/article/details/4996471,里还有exit和_exit(),看到这个就想起了cd和cd ~,su和su -的区别(虽然在f9上还是有区别的,不过在ubuntu10.10上看不出任何差别啊,可以看做系统更人性化了吧)

       目前就是这样了,对于进程什么的,还是压力巨大的,对window下的线程倒是试过,以后有时间了,慢慢试试linux下的进程通信什么的。

       菜鸟goes on~~~

Linux创建进程链、进程扇、进程树 如何创建进程链、进程扇、进程树 阅读详情

相关推荐

Windows 11下manage-bde命令实战:BitLocker锁了别慌,手把手教你用命令行找回数据

本文详细介绍了在Windows 11系统下使用manage-bde命令解锁BitLocker加密驱动器的实战方法。通过命令行诊断、恢复密钥获取、解锁流程演示及高级故障排除,帮助用户在系统锁定后快速找回数据,特别适合IT技术人员和遇到紧急情况的用户。

weixin_30902251的博客 328

execvp函数详解_如何在C / C ++中使用execvp()函数

execvp函数详解In this article, we’ll take a look at using the execvp() function in C / C++. 在本文中,我们将介绍如何在C / C ++中使用execvp()函数。 In UNIX, the execvp() function is very useful if you want to run another pr...

从零开始的教程世界 3万+

SIwave串扰分析保姆级教程:从Allegro文件导入到结果解读,手把手教你排查PCB信号问题

本文提供SIwave串扰分析的详细教程,从Allegro文件导入到结果解读,手把手教你排查PCB信号问题。涵盖环境准备、参数配置、串扰扫描技巧及实战案例,帮助工程师精准定位和解决高速PCB设计中的串扰问题,提升信号完整性分析能力。

weixin_42620913的博客 255

linux查询进程号,出现两个进程

[root@ADM01B ~]# ps -ef|grep iesmgr root 5929 5321 0 09:38 pts/7 00:00:00 grep iesmgr root 9798 1 0 Jun28 ? 00:00:05 iesmgr [root@ADM01B ~]# kill -9 5929 -bash: kill: (...

859

道路损伤检测必备:RDD2022数据清洗与增强的5个关键步骤

本文详细介绍了道路损伤检测中RDD2022数据集清洗与增强的5个关键步骤。通过深度数据质量审计、跨国家分布分析、面向真实场景的智能增强、以模型表现为导向的数据集划分,以及构建自动化处理流水线,将原始数据转化为高质量训练集,有效提升模型性能。

cola5的博客 511

薄膜比拟、开口截面扭转承载力以及风电混塔水平缝张开状态下抗扭承载力推导

风电混塔水平缝张开状态下的抗扭承载力推导,从弹性力学说起

George的博客 872

linux脚本里ps进程多出一个,运行shell脚本时进程数量变多

写了一个很简单的脚本,用于统计memcache进程的数量:#!/bin/bashecho `ps aux | grep memcache | grep -v grep | wc -l`然而在执行时却遇到了问题:[work@ oss_memcache_status]$ pwd/home/work/cdn/monitor/ocelot-scripts/oss_memcache_status[work@...

weixin_31286719的博客 1321

Stata新手避坑:用reghdfe搞定行业、地区多重固定效应,告别‘共线性’报错

本文详细介绍了如何使用Stata中的reghdfe命令高效处理多重固定效应问题,解决传统方法在面板回归中遇到的共线性报错和低R²问题。通过实战案例和高级技巧,帮助新手快速掌握行业、地区等多维固定效应的控制方法,提升经济学和金融学研究的分析效率。

weixin_30635053的博客 419

nginx篇-解析nginx多进程问题

启动nginx后,查看nginx启动的线程,会发现nginx出现多个线程 查看线程 ps -ef|grep nginx 默认使用nginx.conf配置只会显示两个线程,一个master进程,一个worker进程,这两个nginx进程都有各自的作用, "worker"进程天生就是来"干活"的,真正负责处理请求的进程就是你看到的"worker"进程 “master"进程其实是负责管理"worker"进程的,除了管理” worker"进程,master"进程还负责读取配置文件、判断配置文件语法的工作,“ma

weixin_44923168的博客 1万+

oh-my-zsh详细安装与主题插件配置

使用Linux的小伙伴都知道默认shell是bash,但是对于喜欢折腾,喜欢酷炫的我们bash怎能够用。zsh的作为一种shell,功能更强大,但是配置复杂。后来,有大佬创建了一个名为oh-my-zsh的开源项目,使用方便,功能强大。 下面就去oh-my-zsh的配置。 ①安装zsh 想要安装oh-my-zsh,首先得安装zsh,输入命令 sudo apt-get install zsh 界面如下 ②查看是否安装成功 输入命令 zsh --version 可以查看安装zsh的版本..

惜洛-Jankin的博客 2万+

8.26华为OD机试真题 新系统 - 仓库查询 (Java/Py/C/C++/Js/Go)

8.26华为OD机试真题 新系统 - 仓库查询 (Java/Py/C/C++/Js/Go)

算法大师! 1728

【Linux】进程

本文将详细的介绍Linux环境的进程,与进程状态和进程优先级。

Yui_的博客 2049

QGC4.0.11界面修改

QGC4.0.11。

超维空间科技的博客 2464

linux中什么是进程名,Linux进程是什么

进程是 Linux 操作系统中最重要的基本概念之一,这一节我们将了解学习 Linux 进程的一些基础知识。进程是运行在 Linux 中的程序的一个实例。这是一个你之前就可能已经听说过的基本定义。当你在 Linux 系统中执行一个程序时,系统会为这个程序创建特定的环境。这个环境包含系统运行这个程序所需的任何东西。每当你在 Linux 中执行一个命令,它都会创建,或启动一个新的进程。比如,当你尝试运行...

weixin_39551554的博客 2053

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

<Linux> 进程

进程有关概念、如何创建进程、进程状态、环境变量详解、进程优先级、程序地址空间、如何控制进程以及如何替换进程

weixin_61522065的博客 4302

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【linux】进程控制——进程创建,进程退出,进程等待

一个进程创建了另一个进程,创建者为父进程,被创建者为子进程。父进程可以创建多个子进程。操作系统是一号进程,所有进程构成一颗多叉树结构。每个父进程只对直系的子进程负责。父进程创建子进程的一整套流程为:创建子进程——>子进程完成任务——>父进程回收子进程父进程先退,子进程未退。此时子进程的父亲进程被改为1号进程(操作系统),那么该子进程被称为孤儿进程父进程未退,子进程先退。但父进程没有读取到子进程的退出(进程等待),该子进程的状态被改为 Z 状态,Z 状态的进程被成为僵尸进程。

2301_79796701的博客 2706

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【linux 多进程并发】0301 Linux创建后台服务进程,daemon进程,自己的进程可以被一号进程接管啦

通常我们在终端启动程序,该程序的父进程一般是终端进程,这样在终端退出时,会产生像SIGHUG信号发给所有子进程,子进程默认处理是退出。 我们要创建后台服务进程时,必需让进程与终端无关,这就是示例代码中经过一次fork之后,父进程退出,而子进程让systemd接管的真正作用。 本章节代码位于[gitcode](https://gitcode.com/toadb/hatchCode/overview), 路径为: multiProcess/ex02_multiprocess, 有兴趣的同学可以下载测试,当然

一个追逐梦想的码农 3232

Linux进程——Linux下常见的进程状态

在了解Linux中进程的分类时,我们通常是先了解操作系统的进程,因为二者有一定的联系,了解操作系统能更好理解进程在操作系统中的运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!

EterNity_TiMe_的计算机学习之路 2792

【Linux】Linux进程管理

Linux进程管理

Linux小白一只~正处于学习阶段,觉得我写的还好的请多多给我点赞呀,谢谢大家!!(๑>ڡ<)☆ 5213

linux进程

这个文件用来检查内核数据结构的当前状态,通常由GDB调试使用 /proc/kmsg:此文件用来保存由内核输出的信息 /proc/meminfo:系统中关于当前内存的利用状况等的信息,常由free命令使用 /proc/version:当前系统运行的版本号 /proc/sys:与/proc下其他文件的只读属性不同,管理员可对/proc/sys子目录中的徐彤文件内容进行修改以更改内核的运行特性,事先可以使用ls -l查看某文件是否可写入。进程是程序的一次执行过程,动态的,包括创建、调度、执行和消亡。

m0_45148083的博客 1620

Linux进程控制——Linux进程终止

进程终止相对于其他的进程控制来说,是很好理解的。我们主要介绍了进程终止,在明白错误码和退出码之后,相信能理解父进程是怎么得到子进程信息的。让我们期待下一节——进程等待与替换!

EterNity_TiMe_的计算机学习之路 2342

Linux——进程概念

进程概念精析

2302_81486993的博客 3290

linux查找被杀死的进程,linux查找进程和杀死进程

查看进程:ps -ef | grep 检索内容杀死进程:kill pid (进程号)kill -9 pid 强制杀死进程ps命令将某个进程显示出来grep命令是查找中间的|是管道命令 是指ps命令与grep同时执行PS是LINUX下最常用的也是非常强大的进程查看命令grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是G...

weixin_34944897的博客 2447

Linux之进程

进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位作业控制--- 一个命令行功能,允许一个shell实例来运行和管理多个命令,Shell的一个特性,使用户能在多个独立进程间进行切换命令及作用命令作用cmd&该命令在后台运行Ctrl+d终止一个正在前台运行的进程(含有正常含义)Ctrl+c终止一个正在前台运行的进程(含有强行含义)

qq_57289939的博客 3220

linux 系统master进程,Linux进程监视

由于复刻了 mon 项目到 etbemon 中,我花了一些时间做监视脚本。事实上监视一些事情通常很容易,但是决定监视什么才是困难的部分。进程监视脚本 ps.monitor 是我重新设计过的一个。对于进程监视我有一些思路。如果你对进程监视如何做的更好有任何建议,请通过评论区告诉我。给不使用 mon 的人介绍一下,如果一切 OK 该监视脚本就返回 0,而如果有问题它会返回 1,并使用标准输出显示错误信...

weixin_35598104的博客 2776
上一篇: 面试题之丑数的C++实现求解(孤陋寡闻了,才知道丑数这么high的东东)
下一篇: 强大的g++呢还是强大的C++?太假了吧
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值