Linux 多学习过程

1Linux流程概述

过程是,一旦运行过程中的程序,他和程序本质上的区别。程序是静态的,他奉命收集指令存储在磁盘上。
进程是动态的概念。他是执行者的程序,包括进程的动态创建。调度和消亡,是Linux的基本调度单位。
进程控制块(PCB)是进程的静态描写叙述,包含进程的描写叙述信息。进程的控制信息,以及资源信息
时间片:他轮流在每一个进程的得到的时间片用完后从进程那里千回控制权

1.1进程标识

os会为每个进程分配一个唯一的盛行ID。作为进程的标识号(pid)。还有父进程ID(ppid)
全部的进程的祖先都是同一个进程init进程,ID为1
通过getpid(),getppid() 得到进程的pid。ppid
实例:printf("pid:%d ppid:%d\n",getpid(),getppid());

1.2进程的用户ID与组ID

进程执行过程中必须有类似于用户的身份,哪个用户就是该用户的身份,就是那个用户的组
可用getuid(),getgid();获得
进程还有有效用户ID和有效组ID,缺少的情况下,与真实ID同样,能够用geteuid(),getegid();
文件权限有S的时候,有效ID是进程的全部者(创建者),否则有效ID就是程序的执行者,与真实ID同样
ps -aux查看全部用户进程的权限,cpu,和内存的使用情况
ps -ef 查看用户操作的PID与PPID 与CMD(命令行)

1.3进程的状态

运行态。就绪态。等待态

1.4LInux下的进程结构

Linux中的进程包括三个段:数据段,代码段,堆栈段
数据段:(普通数据段)全局变量,常熟(bbs数据段)为初始化的全局变量以及(堆)动态数据分配的数据空间
代码段:存放程序代码的数据
堆栈段:子程序的返回地址,子程序的參数。程序的局部变量




1.5LInux下的进程管理




进程process:是os的最小单位
1)ps查看活动进程
2)ps -aux查看全部进程%cpu。%mem stat状态(S睡眠T暂停R执行Z僵尸)
3)ps -aux|grep'aa' 查找指定的(aa)进程
4)ps -ef能够现实父子关系和cmd
5)top现实前20条的进程。动态改变
6)./my_add 可能要执行非常长时间。按ctrl+z能够把京城暂停。在执行  bg作业ID 能够将该进程带入后台执行比如:
[1]+ ./my_add 1 34 &  ,&表示该进程在后台正在执行。
利用jods能够查看后台任务
fg作业ID 把后台人物带到前台
7)kill -9 进程号(PID) 杀掉该进程  ,pkill a 进程名

2 进程的创建

Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen();

2.1system函数

system函数system括号中面放的是命令,也就是cmd
 样例例如以下:
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
int main(int argc,char *argv[]){char cmd[1024]="";for(int i=1;i<argc;i++){strcat(cmd,argv[i]);strcat(cmd," ");}puts(cmd);int ans;ans=system(cmd);printf("%x\n",ans);
}
用system调用其它可运行程序,并输入參数 输入比如: ./main ./my_add  当中my_add计算两个数之和
当中计算结果在system的返回值高字节上:ret00,所以直接出256
int main(int argc,char *argv[]){if(argc!=2){printf("failed\n");return 0;}int left,right;char cmd[1024]="";char line[1024]="";strcat(cmd,argv[1]);strcat(cmd," ");while(printf(">>"),scanf("%d %d",&left,&right)){memset(line,0,sizeof(line));sprintf(line,"%s %d %d",argv[1],left,right);strcpy(cmd,line);int ret;ret=system(cmd);printf("result:%d\n",ret/256);}
}

2.2fork函数

fork函数在以存在的进程中创建一个新的进程,新的进程作为子进程。原进程为父进程
父进程的返回值是子进程。子进程的返回值是0.
fork创建子进程是全然复制父进程,并且缓冲区也复制
元进程和子京城都从函数fork返回,在各自继续圆形下去。可是元函数的fork返回值
是子进程的pid。而在子进程中fork返回0,返回-1表示创建失败

#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main(int argc,char *argv[]){pid_t pid;int i=3;printf("hello\n");pid=fork();fflush(stdout);//儿子复制的时候将缓冲区也复制了,假设没有这句话。上面的hello将出现两便if(pid>0){printf("parents:pid:%u,ret:%u,pp:%u\n",getpid(),pid,getppid());}else if(pid==0){
//		sleep(5);printf("child:pid:%u,ret:%u,pp:%u\n",getpid(),pid,getppid());}printf("bye!\n");
}

2.3exec函数

exec函数是用exec的第一个參数制定的程序覆盖现有的进程空间。也就是说运行exec族函数之后。他后面的全部代码不再运行
具体用法 在终端输入man exec
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
当中path是包括运行文件名称的全路径名。多个參数时。注意后面最后一个參数必须为NULL,arg是可运行文件的命令行參数

int execl(const char *path, const char *arg, ...);比如:
if(execl("/home/yang/0820/my_exec/","my_add","3","2",NULL)==-1){perror("execl error");}
int execlp(const char *file, const char *arg, ...);比如:
if(execlp("./my_add","my_add","fwef","fwe","fewgeraf",NULL)==-1){perror("execlp error");}
int execv(const char *path, char *const argv[]);比如:

char *args[10];args[0]="my_add";args[1]="12";args[2]="23";args[3]=NULL;if(execv("/home/yang/0820/my_exec/my_add",args)==-1){perror("execl:");}

2.4popen函数(以后补充)

popen函数类似system函数,与system不同之处在于它使用管道操作,
原型为#include<stdio.h>

FILE*popen(const char *command, const char *type);

int pclose(FILE *stream);

command为可运行文件的全路径和运行參数。type可选參数为“r” 或“w”
“w”popen返回的文件流作为新的进程(比如my_add.exe)标准输入流,即stdin
“r”popen返回的文件流作为新进程的标准输出流 stdout,也就是说popen仅仅改变新进程的标准输入流或者标准输出流
popen的具体流程:type为“r”,(即command命令的运行结果作为当前进程的输入结果)。调用程序利用popen函数返回FILE*文件流指针。就能够通过经常使用的stdio库如fgets。来读取被调用函数的输出。

假设type是“w”(即当前的程序的输出结果作为commend命令的输入),调用程序能够用fwrite想调用程序发送数据,而被调用的程序能够在自己的标准输入上读取这些数据

样例:
主程序屏幕输出:
FILE *fp;
char a[1000];
char b[1000];
char cmd[1024]="";
printf("plseas write\n");
fgets(a,1000,stdin);
sprintf(cmd,"%s %s",argv[1],a);
fp=popen(cmd,"r");//这个指令cmd为可运行文件的全路经
fgets(b,1000,fp);
printf("%s\n",b);

新进程屏幕输出:
FILE *fp;
char a[1000];
gets(a);
fp=popen(argv[1],"w");
fputs(a,fp);
pclose(fp);

3.进程控制与终止

用fork函数启动一个子进程时。子进程就有了自己的生命独立执行了
孤儿进程:假设父进程先于子进程退出,子进程就变成了孤儿进程(一般是父进程负责释放子进程的内存空间),此时将自己主动被PID为1的进程(即init)接管。孤儿进程退出后。它的清理工作由祖先进程init自己主动处理
僵尸进程:子进程退出,系统不会自己主动清理掉子进程的工作环境,必须有父进程调佣wait或waitpid函数来完毕清理工作。假设父进程不做清理工作。一经推出的子进程就会成为僵尸进程,系统中假设僵尸进程过多就会影响系统性能
函数原型:
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid,int *status,int options);
wait函数随机等待一个已经退出的子进程,并返回该子进程的pid
waitpid等待制定pid的子进程,如火为-1表示等待全部子进程
status參数是传出參数,存放子进程的退出状态
options用于改变waitpid的行为,当中最重要的是WNOHANG,它表示不管子进程是否有退出都马上返回
产生僵尸进程样例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{pid_t pid = fork();if( pid == 0 ){exit(10);}else{sleep(10);}
}
避免僵尸进程样例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{pid_t pid = fork();if( pid == 0 ){exit(10);}else{wait(NULL);    //NULL表示等待全部进程sleep(10);	//通常要将sleep放在wait的后面,要不然也会出现僵尸进程}
}

3.2进程的终止

5种方式终止:
1) main函数自然返回
2)调用exit函数
3)调用_exit函数
调用abort函数
接受能导致进程终止的信号ctrl + c 
exit与_exit差别:exit会处理缓冲区的内容。_exit不会处理缓冲区的内容

exit_exit函数的原型:

#include<stdlib.h> //exit的头文件

#include<unistd.h> //_exit的头文件

void  exit(int status);

void_exit(int status);

status是一个整型的參数,能够利用这个參数传递进程结束是的状态。0表示正常退出,其它数表示出现错误,进程非正常结束








































版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/yxwkf/p/4674671.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像变换基本概念

图像变换 图像和其他信号一样&#xff0c;既能在空间域处理&#xff0c;也可在频率域处理。 图像频率域处理的特点&#xff1a; 1.能量守恒&#xff0c;但能量重新分配 2.有利于提取图像的一些特征 3.正交变换具有能量集中作用&#xff0c;可实现图像的高效压缩编码 4.频…

王飞跃:平行汽车到平行驾驶,从“功能汽车”到“智能汽车”

来源&#xff1a;智车科技摘要&#xff1a;4月 18 日&#xff0c;在第十八届上海国际车展期间&#xff0c;同期举行了 “2019 AI智能汽车创新峰会”&#xff0c;中科院自动化所王飞跃教授作大会报告&#xff0c;他认为未来交通需要将有人车、遥控车、网联车、无人车通过平行驾驶…

电磁场与电磁波矢量分析

矢量分析 1.矢量代数 1.1标量和矢量 标量&#xff1a;只有大小&#xff0c;没有方向的物理量。 矢量&#xff1a;不仅有大小&#xff0c;而且有方向的物理量。 1.2矢量的表示 1.2.1常矢量 大小和方向均不变的矢量&#xff0c;单位矢量不一定是常矢量。 1.2.2在直角坐标系…

邬贺铨院士:认识工业互联网

中国工程院原副院长、院士邬贺铨来源&#xff1a;走向智能论坛近日&#xff0c;中国工程院原副院长、院士邬贺铨在北京日报发表《认识工业互联网》文章&#xff0c;就工业互联网与消费互联网的异同&#xff0c;以及与人工智能、区块链、工业互联网安全等热点问题进行了解析。文…

数字图像处理 第一章 概述

绪论 1.1 图像和图像处理 1.1.1 图像 “图”是物体透射或反射光的分布,是客观存在的。“像”是人的视觉系统对图在大脑中形成的印象或认识&#xff0c;是人的感觉。图像是图和像的有机结合&#xff0c;既反映物体的客观存在&#xff0c;又体现人的心理因素;图像也是对客观存…

web监听器

web监听器的定义; web监听器是servlet规范中定义的一种特殊类; 用于监听servletContext(application) 、 HttpSession (session)、ServeletRequest (request)等域对象的创建与销毁事件&#xff1b; WEB容器在启动时&#xff0c;它会为每个WEB应用程序都创建一个对应的ServletCo…

数字图像处理 第二章 图像处理基础

数字图像处理基础 2.1 色度学基础 色度学 人的视觉特性 2.1.1 三基色原理 人眼的视网膜上存在有大量能在适当亮度下分辨颜色的锥状细胞&#xff0c;它们分别对应红、绿、蓝三种颜色,即分别对红光、绿光、蓝光敏感。由此,红、绿(G)、蓝(B)这三种颜色被称为三基色。 红、绿、…

人工智能的第三定律:计算的未来是模拟

来源&#xff1a;秦安战略、雷锋网摘要&#xff1a;计算机领域的下一次革命的标志将是模拟系统的崛起&#xff0c;而数字化编程不再具有统治地位。在人工智能研究如火如荼的今天&#xff0c;似乎也是时候回过头来思考一下模拟计算在未来所具有的意义。当人类已经习惯于通过数字…

DevExpress控件库----AlertControl提示控件

AlertControl控件可以在给用户弹出提示信息时&#xff01;能够很好的弹出个性化的窗口。 简单易用&#xff1a;此时弹出窗口&#xff1a; this.alertControl1.Show(this, "提示!", "您有一条消息!"); 简单属性设置&#xff1a;设置提出窗口的显示的位置 th…

数字图像处理 第三章 图像变换

图像变换 图像和其他信号一样&#xff0c;既能在空间域(简称空域)处理,也能在频率域(简称频域)处理。把图像信息从空域变换到频域&#xff0c;可以更好地分析、加工、处理图像信息。因为图像信息的频域处理具有如下特点:①能量守恒&#xff0c;但能量重新分配;②有利于提取图像…

数字图像处理 第四章 图像增强

图像增强 图像增强按照作用域可分为空域法和频域法两类。 1.空域法 空域法是直接对图像的像素灰度值进行操作。常用的空域法包括图像的灰度变换、直方图修正、图像空域平滑和锐化处理、彩色增强等。 2.时域法 频域法是在图像的变换域中,对图像的变换值进行操作,然后经逆变…

一文看懂人脸识别技术发展脉络

来源&#xff1a;InfoQ人脸识别可以说是人工智能领域中成熟较早、落地较广的技术之一&#xff0c;从机场、火车站的安检闸机&#xff0c;到平常用户手机中的“刷脸”支付&#xff0c;人脸识别技术已经深入到我们的生活当中。为了让各位读者深入浅出地全面了解人脸识别技术&…

Linux服务器运行环境搭建(二)——Redis数据库安装

官网地址&#xff1a;http://redis.io/ 官网下载地址&#xff1a;http://redis.io/download 1. 下载Redis源码&#xff08;tar.gz&#xff09;&#xff0c;并上传到Linux 2. 解压缩包&#xff1a;tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹&#xff1a;cd redis-2.…

第三章 VHDL语言的基本结构

VHDL语言的基本结构 一、VHDL设计简述 VHDL主要用于描述数字系统的结构、行为、功能和接口。 VHDL将一个设计(元件、电路、系统)分为: 外部(可视部分、端口) 内部(不可视部分、内部功能、算法) 1.VHDL语言的一些基本特点 二、实体 1.功能 描述设计模块的输入/输出信号或引脚…

中国科学家发现恐惧情绪的新环路

来源&#xff1a;科学网北京时间4月29日23时&#xff0c;浙江大学医学院教授李晓明课题组在《自然-神经科学》在线发表了题为《一条新的介导恐惧逃跑行为的皮层丘脑神经环路》的研究论文。该研究新发现了一条由丘脑网状核介导的从皮层至丘脑的神经环路&#xff0c;参与调控动物…

[FPGA]基于FPGA的数字跑表

基于FPGA的数字跑表的设计与实现 一、设计要求 用FPGA设计并实现一个数字跑表&#xff0c;范围为0~59分59.99秒。可以实现数字跑表进行启动、停止计时和显示读数三个操作&#xff0c;可以在数码管上显示读数。 二、设计任务 2.1基本部分 &#xff08;1&#xff09;了解FPGA开发…

人工智能:AI 芯片快速起航

来源&#xff1a;平安证券摘要&#xff1a;当前&#xff0c;在算力、算法和大数据三驾马车的支撑下&#xff0c;全球人工智能进入第三次爆发期。然而&#xff0c;作为引爆点的深度学习算法&#xff0c;对现有的算力尤其是芯片提出了更为苛刻的要求。在AI场景中&#xff0c;传统…

坐标系编程

世界坐标系(平移)->惯性坐标系&#xff08;旋转&#xff09;->物体坐标系 世界坐标系与惯性坐标系的坐标轴平行 惯性坐标系与物体坐标系的原点重合 转载于:https://www.cnblogs.com/xrj3000/p/4693954.html

未来今日研究所:2019技术趋势报告

来源&#xff1a;资本实验家摘要&#xff1a;近期&#xff0c;著名研究机构未来今日研究所&#xff08;Future Today Institute&#xff09;发布了《2019技术趋势报告》。该报告涉及人工智能、网络安全、隐私与数据、交通、先进机器人、电子竞技、营销与广告、能源、气候与地理…

7大车企电动策略,平台化到底是解药还是毒药?

来源&#xff1a;车云电动化&#xff0c;已经成为当下汽车行业绕不开的话题&#xff0c;虽然几个国际主流汽车面对电动时代的态度都不一样&#xff08;各自的情况不同&#xff09;&#xff0c;但不得不说&#xff0c;它们都在积极筹备着这一产业转型带来的冲击。电动化平台&…