- 前言
- 一、理论部分
- 二、实际 *** 作
- 1.创建子进程(fork)
- 2.子进程进阶(五个儿子)
- 3.中止进程(exit)
- 4.进程回收(wait waitpid)
- 5.执行指定的程序(exec族)
- 6.守护进程(五步走)
- 7.GDB调试多进程(后续添加)
- 总结
进程概念:程序 ---存放在磁盘上的指令和数据的有序集合(文件) 进程 ---执行一个程序所分配的资源的总称,进程是程序的一次执行过程(创建、调度、执行和消亡)
进程类型: 交互进程、批处理进程、守护进程。
进程状态:运行态、等待态、停止态、死亡态
进程常用命令--基于Linuxps | 此刻运行的进程(-e -f -l) |
top | 实时显示进程(shift +> 后翻页,shift +< 前翻页)(top -p 41) |
/proc | 查看(某某)进程详细信息 |
nice | nice [-n NI值] 命令(NI 范围是 -20~19) renice [优先级] PID |
jobs | 查看后台进程 |
bg | 将挂起的进程在后台运行 |
ctrl+z | 把运行的前台进程转为后台并停止 |
./test & | 把test程序后台运行 |
静态的
二.实际 *** 作 (1)创建进程#include
#include
int main(){
pid_t pid;
printf("fu jin cheng\n");
//fork后面的内容属于子进程的内容
pid = fork();
printf("pid=%d\n",(int)pid);
printf("zi jin cheng\n");
}
/*
int main(){
pid_t pid;
pid = fork();
if(pid>0){ //fu jin cheng
printf("fu jin cheng\n");
printf("pid=%d\n",(int)pid);
}else if(pid ==0){ //zi jin cheng
printf("zi jin cheng\n");
printf("pid=%d\n",(int)pid);
}else if(pid <0){ //chu cuo le
}
}*/
#include
#include
int main(){
pid_t pid;
pid = fork();
if(pid>0){ //fu jin cheng
printf("fu jin cheng\n");
printf("pid=%d\n",(int)pid);
while(1){
sleep(1);
printf("fu jin cheng\n");
}
}else if(pid ==0){ //zi jin cheng
printf("zi jin cheng\n");
printf("pid=%d\n",(int)pid);
while(1){
sleep(1);
printf("zi jin cheng\n");
}
}else if(pid <0){ //chu cuo le
}
}
(2)子进程进阶(五个儿子)
#include
#include
int main(){
pid_t pid;
int i;
for(i=0;i<5;i++){
pid = fork();
if(pid<0){
perror("fork ");
return 0;
}else if(pid == 0){
printf("zi jin cheng \n");
sleep(4);
break;
}else{
printf("fu jin cheng\n");
sleep(4);
}
}
}
(3)中止进程#include
#include
#include
int main(int argc,char**argv){
printf("hello world\n");
//exit(0);
printf("after exit\n");
return 0;
}
(4)进程回收(wait waitpid)
#include
#include
#include
#include
int main(int argc, char** argv){
pid_t pid;
pid_t rpid;
pid = fork();
int status;
if(pid<0){
perror("fork");
return 0;
}
else if(pid == 0){
sleep(1);
printf("child will exit\n");
exit(2);
}else if(pid >0){
//rpid = wait(&status);
//sleep(20);
waitpid(pid,&status,0);
printf("Get child status=%x\n",WEXITSTATUS(status));
}
while(1){
sleep(1);
}
}
(5)执行指定的程序(exec族)进程当前内容被指定程序替代
#include
//jin5test
int main(int argc,char **argv){
printf("hello world %s,%s\n",argv[1],argv[2]);
}
#include
#include
int main(){
printf("exec zhi qian\n");
if(execl("./jin5test","fsdafsafls","-a","-l","./",NULL)<0){
perror("excel");
}
printf("execl zhi hou\n"); //用jin5test替代了当前的程序,所以应该不会打印这句话
}
在子进程中,去替换东西就,父进程的程序不会被替代
#include
#include
int main(){
pid_t pid;
printf("exec zhi qian\n");
pid = fork();
if(pid == 0){
if(execl("./jin5test","fsdafsafls","-a","-l","./",NULL)<0){
perror("excel");
}
printf("zi jin cheng\n"); //子进程的程序,会被execl替代掉
}
printf("execl zhi hou\n");
}
(6)守护进程(五步走)
守护进程(Daemon Process)是Linux三种进程类型之一,是 Linux 中的后台服务进程
是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件
•创建子进程,父进程退出 •子进程创建新会话 .更改当前工作目录 •重设文件权限掩码 •关闭打开的文件描述符
(7)GDB调试多进程程序
等后续再详细写
三.总结在兴趣的基础上,搞点有意思的东西。
四.系列文章,其他模块可直接参考开头的链接目录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)