什么是程序,什么是进程,有什么区别?
程序是静态文件,进程是程序的运行活动
如何查看系统中有哪些进程?
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{}
下->上 低地址->高地址
<unistd.h>
pid_t fork()
函数返回2次,0代表当前进程是子进程,非负数(子进程pid)是父进程,-1调用失败
fork()以后的语句,父子进程都会跑。
retpid=fork() retpid会拷贝两份。
早期设计Linux系统时创建新进程把整个数据空间拷贝,后期为提高效率,进行写时拷贝(子进程对数据进行修改的时候再拷贝)
创建子进程一般目的:父进程希望复制自己,使父子进程同时执行不同代码段。
(socket收到一个请求时创建多进程对接)
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不创建新进程。
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(const *char)返回进程状态值,失败-1
system是封装后的execl函数,括号内写shell命令,=sh -c command,
system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程
system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程
system(“ls”);
FILE *fp=popen(“ps”,”r”)w标准输入
fread(ret,1,1024,fd)
和system相比,可将执行结果读取到数组中。