Linux教程

Linux进程

本文主要是介绍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进程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!