Linux☞进程控制

在终端执行命令时,Linux会建立进程,程序执行完,进程会被终止;Linux是一个多任务的OS,允许多个进程并发运行;

Linxu中启动进程的两种途径:

①手动启动(前台进程(命令gedit)...后台进程(命令+‘&’))

②调度启动   --at/cron启动

at执行的命令一般不会在终端回显,可以采用重定向到文件就可以查看;

Linux环境下常见的进程操作命令:

ps--查看系统中的进程;

top--动态显示系统中的进程;

kil--终止进程(包括后台进程);

Linux环境下的进程会有一个唯一的进程标识符(pid),进程标识有进程号PID和它的父进程号PPID,PID唯一标识一个进程,其中,PID和PPID都是非零正整数。获得当前进程的PID和PPID的系统调用是getpid()和getppid()函数【头文件unistd.h】;

ps -ef|grep test1   (可以查找程序test1.c运行时的进程号);

3个特殊进程:

PID为0的调度进程,是内核的一部分,也被称为交换进程和系统进程;

PID为1的init进程(centos6及之前版本),init进程是内核启动并运行的第一个用户进程(不是内核中的系统进程),负责对系统进行初始化,并将系统引导到某个状态。init进程不能被终止

 PID为2的kthreadd内核进程,其是一个内核线程,负责执行后台操作。

进程相关函数: 

exec函数族--在进程中启动另一个程序执行;

system--在进程中开始另一个进程;

fork--从已经存在的进程中复制一个新进程

sleep--让进程暂停运行一段时间;

exit/_exit--用来终止进程

wait/waitpid--暂停父进程,等待子进程完成运行;

Fork函数

 进程调用一次fork函数创建一个新进程,新创建的新进程被称为子进程。该函数调用一次但是返回两次,子进程返回值是0,父进程返回新的子进程的pid。父、子进程并不共享这些存储空间部分,通常父、子进程共享代码段;子进程继承父进程的以下属性:已打开的文件描述符 实际UID、GID,有效UID、GID 当前工作目录 根目录 文件创建UMASK 环境 资源限制

exec函数族

例6-3:用fork函数创建一个子进程,在子进程中。要求显示子进程号和父进程号,然后显示当前目录下的文件信息,在父进程中同样显示子进程号和父进程号;

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{pid_t result;int newret;result=fork();if(result==-1){printf("进程创建失败");}else if(result==0){printf("返回值是:%d,这是子进程,进程号是:%d\n",result,getpid());printf("父进程号是:%d\n",getppid());execl("/bin/ls","ls","-l",0);}else{sleep(10);printf("返回值是:%d,这是父进程,进程号是:%d\n",result,getpid());printf("父进程号是:%d\n",getppid());}
}

total后是ls列出的内容,

 exec族的6个函数来建立子进程分别是execl、execv、execle、execve、execlp、execvp函数;其中l、e、v、p表示函数中的参数分别用列表传递方式、字符指针数组传递方式、可指定环境变量及路径自动搜索功能;

exec示例:

char *const ps_argv[]={"ps","-o","pid,ppid,pgrp,session,tpgid,comm",NULL};

char *const ps_envp[]={"PATH=/bin:/user/bin","TERM=console",NULL};

execl("/bin/ps","ps","-o","pid,ppid,pgrp,session,tpgid,comm",NULL);

execv("/bin/ps",ps_argv);

execle("/bin/ps","ps","-o","pid,ppid,pgrp,session,tpgid,comm",NULL,ps_envp);

execve("/bin/ps",ps_argv,ps_envp);

execlp("ps","ps","-o","pid,ppid,pgrp,session,tpgid,comm",NULL);

execvp("ps",ps_argv);

 exec应用:

1.execv函数的使用,要在程序中执行命令:ps -ef,命令ps在’/bin‘目录下,在这一函数中,参数v表示参数传递(含命令)为构造指针数组方式;

char* arg[]={"ps","-ef",NULL};

函数的使用:

execv("/bin/ps",arg);

【ps命令参数】

-e 显示所有进程(等价于-A)
-f  全部列出,通常和其他选项联用】

//参考程序为:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{char *argv[]={"ps","-ef",NULL};execv("/bin/ps",argv);return 1;
}

2.execlp函数的使用,在程序中执行命令:ps -ef,命令ps在‘/bin’目录下,在这一函数中,参数l表示命令或参数逐个列举,参数p是文件查找方式(自动检索路径而不需要给出路径),函数调用形式:

execlp("ps","ps","-ef",NULL);

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{execlp("ps","ps","-ef",NULL);return 1;
}

3.execl函数应用,在程序中执行命令:ps -ef,命令ps在‘/bin’目录下,在这一函数中,参数l表示命令或参数逐个列举,需要给定路径,函数调用形式如下:

execl("/bin/ps","ps","-ef",NULL);

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{execl("/bin/ps","ps","-ef",NULL);return 1;
}

4.execle函数应用,execle("/bin/login","login","-p",username,NULL,envp);上述语句运行时,login提示用户输入密码,输入密码期间关闭终端的回显,然后验证密码的正确性,如果密码不正确,login终止,init会重新fork/exec一个getty进程。如果密码正确,login程序设置一些环境变量,并设置当前的工作目录位用户的主目录;

5.设计程序,在子进程中调用函数execl(''/bin/ps","ps","-ef",NULL),而在父进程中调用函数execle("/bin/env","env",NULL,envp),其中定义:char *envp={"PATH=/tmp","USER=liu",NULL};

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{char *envp[]={"PATH=/tmp","USER=liu",NULL};pid_t result;result=fork();if(result==-1){printf("创建进程失败!\n");}else if(result==0){printf("创建进程成功\n");execl("/bin/ps","ps","-ef",NULL);}else{sleep(5);printf("父进程\n");execle("/bin/env","env",NULL,envp);}return 1;
}
//测试程序,先输出“创建进程成功”,之后运行ps- ef命令,停顿5秒后,输出"父进程",显示env命令内容:
PATH=/tmp
USER=liu

进程终止的两种形式:

①正常终止:main返回、调用exit函数、调用_exit系统调用;

②异常终止:被信号终止、调用absort,使其产生SIGABRT信号;

exit函数、_exit系统调用区别:

设计程序使得子进程和父进程在显示输出一些文字后用_exit和exit函数终止进程;

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{pid_t result;result=fork();if(result==-1){printf("创建进程失败!\n");exit(0);}else if(result==0){printf("测试终止进程的_exit函数\n");printf("目前为子进程,这一行我们用缓存!");_exit(0);}else{sleep(5);printf("测试终止进程的exit函数\n");printf("目前为父进程,这一行我们用缓存!");exit(0);}return 1;
}

printf函数使用的是缓冲I/O方式,在遇到‘\n’换行符时,自动将缓冲区的记录读出;在调用exit函数时,会先调用退出处理函数,然后清理I/O缓冲区,最后执行exit系统调用,而_exit函数则是直接调用exit系统调用,因此无法正常输出缓冲区的内容;

如果在子进程中调用sleep(5),父进程不调用会出现:

XXX

僵尸进程

一个已经终止运行、但其父进程还没对其进行善后处理(获得终止子进程的有关信息、释放它所占有的资源)的进程;

使用fork创建的子进程,在父进程已经结束,但其还在继续运行,子进程进入无父进程的状态,称之为孤儿进程;孤儿进程会很快被init/systemd所收养;另外,为避免这种情况,可以通过在父进程中调用wait函数/waitpid函数,使得子进程比父进程早终止;

示例:僵尸进程的产生

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{pid_t result;result=fork();if(result==-1){printf("创建进程失败!\n");exit(0);}else if(result==0){printf("这是子进程,进程号是:%d\n",getpid());}else{wait(NULL);  //init系统消除僵尸进程;sleep(20);printf("这是父进程,进程号是:%d\n",getpid());}return 1;
}

一个程序退出时,它的子进程会被init进程继承,它是Linux启动后的第一个进程,init进程会自动清理所有它所继承的僵尸进程。

例:在父进程中调用wait函数等待子进程,父进程直到接收到子进程结束的信号后,父进程结束等待。设计一个程序,要求创建一个子进程,子进程显示自己的进程号pid后暂停一段时间,父进程等待子进程正常结束,打印显示等待的进程号pid和等待的进程退出状态。

//待定

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

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

相关文章

数据库安全加固与API防护策略

在数字化时代&#xff0c;数据库作为企业核心资产的安全性至关重要。然而&#xff0c;随着网络攻击手段的不断演进&#xff0c;数据库和API接口成为了黑客的主要攻击目标。本文将探讨数据库被攻击、API接口被滥用的情况&#xff0c;并提供一系列实用的防护措施&#xff0c;旨在…

【玩转C语言】第三讲---> scanf 和 printf 函数详解(非常重要)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 引言&#xff1a; 大家好&#xff0c;我是坊钰&#xff0c;为了让大家深入了解C语言&#xff0c;我开创了【玩转C语言系列】&#xff0c;将为大家介绍C语言相关知识…

C++ ─── STL 以及string

前言&#xff1a;什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 STL的六大组件 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符…

Ambari集成Apache Kyuubi实践

目前还有很多公司基于HDP来构建自己的大数据平台&#xff0c;随着Apache Kyuubi的持续热度&#xff0c;如何基于原有的HDP产品来集成Apache Kyuubi&#xff0c;很多人都迫切的需求。集成Apache Kyuubi到HDP中&#xff0c;主要涉及Ambari的二次开发。本文详细叙述了集成Apache K…

分享一个用python的本地WIFI密码查看器

本章教程&#xff0c;主要分享一个本地wifi密码查看器&#xff0c;用python实现的&#xff0c;感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块&#xff0c;用于执行系统命令 import tkinter as tk # 导入 tkinter 模块&#xff0c;用于创建图形用…

实现Ingress-Nginx Controller高可用方案

文章目录 前提准备1.修改Ingress-Controller 运行模式为hostNetwork并生效2.给部署ingress-controller的节点打标签3.查看ingress-controller的部署情况 方式一&#xff1a;LVSKeepalivedNginxIngress一、部署ipvsadm和keepalived二、配置keepalived1.配置lvs01(keepalived mas…

Java Web学习笔记27——对话框、表单组件

常见组件对话框&#xff1a; Dialog对话框&#xff1a;在保留当前页面状态下&#xff0c;告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思&#xff0c;点击按钮的时候&#xff0c;才会true&#xff0c;对话框才会显示。 …

python Tk 获取输入框内容,分割内容

创建输入框、一个按钮和一个标签的GUI。 用户可以在输入框中输入文本&#xff0c;点击按钮后&#xff0c;程序将在控制台打印输入的文本&#xff08;已经分割为列表&#xff09;&#xff0c;并在GUI中的标签上显示一些静态文本。 import tkinter as tk# 创建主窗口 root tk.…

基于SpringBoot+Vue学生请假管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

linux指令--sed

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法解析 sed [选项] 编辑命令 文件 选项&#xff1a; -n&#xff1a;只显示匹配处理的行-e&#xff1a;执行多个编辑命令时-i&#xff1a;在原文件中进行修改&#xff0c;不输出到屏幕-…

qsort函数

学习c语言的过程中少不了的就是排序&#xff0c;例如冒泡排序&#xff08;不清楚的同学可以翻找一下之前的文章&#xff09;&#xff0c; 我们这里将冒泡排序作为一个自定义函数来呈现一下 #include<stdio.h>void bubble_sort(int arr[], int len) {for (int i 0; i &…

【Vue】mutations

文章目录 一、定义mutations二、组件中提交 mutations三、带参数的 mutations 一、定义mutations mutations是vuex中的对象&#xff0c;这个对象可以定义在当前store的配置项中 const store new Vuex.Store({state: {count: 0},// 定义mutations// mutations是一个对象&#x…

Progressive Feature Fusion Framework Based on Graph Convolutional Network

以Resnet50作为主干网络&#xff0c;然后使用GCN逐层聚合多级特征&#xff0c;逐级聚合这种模型架构早已不新鲜&#xff0c;这篇文章使用GCN的方式对特征进行聚合&#xff0c;没有代码。这篇文章没有过多的介绍如何构造的节点特征和邻接矩阵&#xff0c;我觉得对于图卷积来说&a…

自动化Reddit图片收集:Python爬虫技巧

引言 Reddit&#xff0c;作为一个全球性的社交平台&#xff0c;拥有海量的用户生成内容&#xff0c;其中包括大量的图片资源。对于数据科学家、市场研究人员或任何需要大量图片资源的人来说&#xff0c;自动化地从Reddit收集图片是一个极具价值的技能。本文将详细介绍如何使用…

多个p标签一行展示,溢出隐藏

一开始&#xff0c;我是让div包裹多个p标签&#xff0c;并让div“flex”布局&#xff0c;且单行溢出隐藏&#xff0c;可是发现当父元素或当前元素有flex时&#xff0c;text-overflow: ellipsis;是不生效的 大多数解决办法都是&#xff0c;不要flex&#xff0c;或者给div下的每个…

【启程Golang之旅】网络编程与反射

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

Java进阶_多态特性

生活中的多态 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c;如图所示&#xff1a; 现实中&#xff0c;比如我们按下 F1 键这个动作&#xff0c;同一个事件发生在不同的对象上会产生不同的结果。…

达梦8 探寻达梦排序机制之一:传统排序机制(SORT_FLAG=0)

测试版本&#xff1a;--03134283938-20221019-172201-20018 达梦的排序机制由四个dm.ini参数控制&#xff1a; SORT_BUF_SIZE 100 #maximum sort buffer size in MegabytesSORT_BLK_SIZE 1 #ma…

自动化立体库集成技术--含(思维导图)

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着科技的不断进步和物流行业的快速发展&#xff0c;自动化立体库集成技术已成为现代物流仓储的重要支撑。 它利用先进的自动化设备和智能化管理…

[leetcode hot 150]第一百三十七题,只出现一次的数字Ⅱ

题目&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 由于需要常数级空间和线性时间复杂度…