进程相关基本概念
进程和程序
Linux下的进程结构
Linux系统中进程类型
批处理进程如脚本
进程状态
进程的模式
int 0x80是中断
Linux下的进程管理
、
命令:ps aux 查看所有进程信息
1号进程是所有进程的祖先进程(init 进程)
SATA表示进程的状态
命令:ps -ef 与ps aux的区别是显示的信息要少一点,不显示状态了,但是可以看到父子进程关系
命令:pstree
命令:top
查看当前进程运行状态,类似Windows的任务管理器
进程的创建
进程创建实验
#include <unistd.h>
int main(void)
{
pid_t pid;
// 思考不加上换行后会有什么情况出现
printf("Process Creation Study");
pid = fork();
switch(pid) {
case 0:
printf("子进程在运行,pid是%d,父进程的pid是%d\n", getpid(), getppid());
break;
case -1:
perror("Process creation failed\n");
break;
default:
printf("父进程在运行,创建的子进程PID是%d,我的PID号是%d\n", pid, getpid());
break;
}
printf("success!\n");
exit(0);
}
这里由于Clion的原因,代码的执行在Linux上运行更更看出准确的实验结果:
注意:
- 父进程要是想看到创建的子进程的pid号只有fork()执行的时候的一次机会,只能保存当时返回的pid才知道,后续再次执行就会创建不一样的
- 父进程退出后终端立刻出现
- 如果父进程先比子进程先退出,此时子进程被称为孤儿进程,被init进程(pid为1)接管回收
如:
这些数字目录,一个目录就是一个进程号,进程死掉后内存虽然不在了,但是这里还是保存的,因此还需要清楚proc目录下
实验2
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
char * msg;
int k;
printf("Process Creation Study\n");
pid = fork();
switch(pid) {
case 0:
msg = "Child process is running";
k = 3;
break;
case -1:
perror("Process creation failed\n");
break;
default:
msg = "Parent process is running";
k=5;
break;
}
while(k > 0)
{
puts(msg);
sleep(1);
k--;
}
exit(0);
}
进程复制:堆空间,栈空间、代码、全局变量都复制了,但两个进程共用内核。
核心函数是execl();
实验
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
int main()
{
int ret;
pid_t pid;
//char *buf[] = {"df","-h",NULL};
pid = fork();
if(pid == 0){
// ret = execlp("df","df",NULL);
ret = execl("/bin/df","abc","-h",NULL);
// ret = execl("./arg","abc","-h",NULL);
//ret = execv("/bin/df",buf);
if(ret == -1){
perror("execl");
exit(1);
}
}
getchar();
wait(NULL);
printf("success!\n");
}
df命令用于显示磁盘空间的使用情况