ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux进程

2021-09-25 17:32:31  阅读:193  来源: 互联网

标签:调用 exec pid system exit 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相比,可将执行结果读取到数组中。

标签:调用,exec,pid,system,exit,Linux,进程
来源: https://blog.csdn.net/qq_43322125/article/details/120474482

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有