目录
0x01 linux中特殊的进程
0x02 进程的标识
0x03 创建子进程
0x01 linux中特殊的进程
- 0号进程:idle进程,系统启动加载的进程
- 1号进程:systemd进程,系统初始化,是所有进程的祖先进程 init
- 2号进程:kthreadd进程,负责内核中所有进程的调度和管理
0x02 进程的标识
- 每个进程都会有一个非负整数来标识进程,pid
- 查看进程的命令 ps -ef | grep yourprocessname
从左到右依次是:启动进程的用户 进程的id标识 父进程的id cpu占用率 开始时间 启动设备 运行总时间 启动时执行的命令
# 使用getpid(void)可以获取进程的id
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<unistd.h>int main(){printf("进程的id=%d",getpid());printf("进程的父进程id=%d",getppid());sleep(10);return 0;
}
0x03 创建子进程
- 使用fork函数可以创建新的进程
- 在子进程调用fork函数创建进程会返回0,在父进程中使用fork函数会返回进程的ID
- 子进程是父进程的副本
- 子进程获得了父进程的数据空间,堆和栈的副本,不是共享,子进程改变数据,不会影响父进程变量的数据
- 如果父进程先退出,子进程会成为孤儿进程,1号进程会管理孤儿进程,对子进程的状态进行收集工作
- 如果子进程先退出,内核会向父进程发送一个SIGCHLD的信号,如果父进程不处理这个信号,子进程会成为僵尸进程
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>#include<signal.h>void func(int sig){int state;wait(&state);
}
int main(){// 1忽略子进程的sigchld// signal(SIGCHLD,SIG_IGN);// 3使用函数处理信号signal(SIGCHLD,func);File* file=fpopen("/tmp/tmp.txt","w+");fprintf(file,"this is a test\nfflush(file);printf("进程的id=%d",getpid());sleep(10);printf("进程的id=%d",getpid());int pid=fork();printf("fork出的id为%d",pid);sleep(1);if(pid==0){printf("子进程的id为%d",getpid());printf("子进程的父进程id为%d",getppid//子进程的逻辑代码fprintf(fp,"子进程 this is a test\n");}if(pid>0){printf("父进程的id为%d",getpid());printf("父进程的父进程id为%d",getppid());//父进程的逻辑代码fprintf(fp," 父进程 this is a test\n");//2 等待子进程退出的代码 使用wait方式阻塞等待子进程退出// int state;// wait(&state);}printf("进程的id=%d",getpid());sleep(30);printf("进程的id=%d",getpid());fclose(file);
}