Linux进程
2021/9/26 7:14:13
本文主要是介绍Linux进程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
进程相关概念
什么是程序,什么是进程,有什么区别?
程序是静态文件,进程是程序的运行活动
如何查看系统中有哪些进程?
ps指令 ps -aux|grep init
top指令
什么是进程标识符?
进程的非负整数表示唯一的ID,叫做pid,类似身份证
pid=0交换进程,作进程调度
pid=1 init进程,作系统初始化
man 2 getpid
<sys/types.h><unistd.h>
pid_t pid=getpid()获取本程序pid号
getppid()获取父进程pid号
是么叫父进程,什么叫子进程?
A进程创建了B进程
c程序的存储空间如何分配?
命令行参数和环境变量:argc,argv[]
栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。
堆:通常在堆中进行动态内存分配。(malloc)
未初始化的数据:int a int array[100]
初始化的数据:int b=10
正文:if{}else{}
下->上 低地址->高地址
创建进程函数fork
<unistd.h>
pid_t fork()
函数返回2次,0代表当前进程是子进程,非负数(子进程pid)是父进程,-1调用失败
fork()以后的语句,父子进程都会跑。
retpid=fork() retpid会拷贝两份。
进程创建发生了什么
早期设计Linux系统时创建新进程把整个数据空间拷贝,后期为提高效率,进行写时拷贝(子进程对数据进行修改的时候再拷贝)
创建新进程的实际应用场景和fork总结
创建子进程一般目的:父进程希望复制自己,使父子进程同时执行不同代码段。
(socket收到一个请求时创建多进程对接)
vfork创建进程
vfork直接使用父进程存储空间,不拷贝
vfork保证子进程先运行,子进程调用exit()退出后,父进程再运行
进程退出
正常退出:
main()函数用return
进程调用exit(),<stdlib.h>
进程调用_exit() <unistd.h>或者Exit() <stdlib.h>,属于系统调用
最后一个线程调用pthread_exit
异常退出:
调用abort
进程收到某些信号,如ctrl+c
最后一个线程取消请求做出响应
用break退出会破坏变量值,exit()是对_exit()和_Exit()的封装(冲刷缓冲区)
父进程等待子进程退出
子进程退出状态不被收集变成僵尸进程。
<sys/types.h><sys/wait.h>
pid_t wait(int *status)
status 为子进程退出状态指向的地址,为0时不关心退出状态
父进程调用wait()后等子进程执行完再执行,并将子进程退出状态值传入status,如果没有子进程立即出错返回
WEXITSTATUS(status)检查返回值终止状态
pid_t waitpid( pid_t pid, int *status, int options)
pid==-1 等待任一子进程
pid>0 等待其进程id与pid相等的子进程
pid=0 等待其组id等于调用进程组id的任一子进程
pid<-1 等待其组id等于绝对值的任一子进程
waitpid(pid, &status, NOHANG); 不等待(子进程执行完仍会变为僵尸进程)
孤儿进程:父进程不等待子进程退出,子进程结束前就结束自己,子进程为孤儿进程。Linux中init进程收留孤儿进程。
exec族函数
进程调用exec函数时,该进程替换为新程序,原程序不再执行。exec不创建新进程。
execl,(“/bin/echoarg”, echoarg, “abc”, NULL)(最后一个参数必须为NULL)
1文件夹 2文件名(a.out) 3参数
失败返回-1,并继续执行原程序
perror(“why”)打印错误原因
whereis ls 寻找ls绝对路径
date 获取系统时间
execlp(使用文件名,并从PATH环境找可执行文件),
echo $PATH 输出环境变量
cd ..上一级目录 /根目录 ~用户主目录 -上一次工作目录
export PATH=$PATH:/home/CLC
cd bin
ls |grep ps
execv(构造一个指向各参数的指针数组,该数组地址作为环境的参数),
execvp,execvpe
system函数
system(const *char)返回进程状态值,失败-1
system是封装后的execl函数,括号内写shell命令,=sh -c command,
system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程
system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程
system(“ls”);
popen函数
FILE *fp=popen(“ps”,”r”)w标准输入
fread(ret,1,1024,fd)
和system相比,可将执行结果读取到数组中。
这篇关于Linux进程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法