c语言进程创建、等待和退出

  1. 创建进程

fork()函数:函数返回值类型为pid_t
若程序运行在父进程中,函数返回的PID为子进程今年称号;
弱运行在子进程中返回PID为0.

#include <sys/types.h>
#include <unistd.h>
#include <iostream>using namespace std;int main(void)
{pid_t pid;pid = fork();//创建新进程if(pid == 0)//子进程{for(int i = 0;i < 50;i++)cout << i << endl;}else if(pid > 0){for(int i = 50;i < 100;i++)cout << "*Father Process*" << endl;}else{cout << "ERRO" << endl;exit(1);}exit(0);
}

vfork():与fork()函数的区别是,在创建线程时fork()函数会复制父进程的所有资源
vfork()不复制资源,而是与父进程共享地址,此时,修改子进程的量就会修改父进程

#include <sys/types.h>
#include <unistd.h>
#include <iostream>using namespace std;int g_var = 10;int main(void)
{int l_var = 10;pid_t pid;pid = vfork();//创建新进程if(pid == 0)//子进程{g_var ++;l_var++;cout << "var in child process:" << endl;cout << "g_var = " << g_var << endl;cout << "l_var = " << l_var << endl;}else if(pid > 0){cout << "var in parent process:" << endl;cout << "g_var = " << g_var << endl;cout << "l_var = " << l_var << endl;}else{cout << "ERRO" << endl;exit(1);}exit(0);
}
  1. 修改进程

exec()函数族:
函数名字中的字符含义:
p ⇒\Rightarrow⇒ path,只需写出文件名,函数自动搜索系统path路径
l ⇒\Rightarrow⇒ list,表示将每个命令行参数都传给他,参数个数可变,最后输入NULL表示结束
v ⇒\Rightarrow⇒ vector,该类函数只支持使用参数数组,数组最后一个指针也要输入NULL,类似于argv[]
e ⇒\Rightarrow⇒ environment,表示将一份新的环境变量表传给他

#include <unistd.h>
#include <sys/types.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

函数名字中的字符含义:
p ⇒\Rightarrow⇒ path,只需写出文件名,函数自动搜索系统path路径
l ⇒\Rightarrow⇒ list,表示将每个命令行参数都传给他,参数个数可变,最后输入NULL表示结束
v ⇒\Rightarrow⇒ vector,该类函数只支持使用参数数组,数组最后一个指针也要输入NULL,类似于argv[]
e ⇒\Rightarrow⇒ environment,表示将一份新的环境变量表传给他

/*execve.c文件*/
#include <sys/types.h>
#include <unistd.h>
#include <iostream>using namespace std;extern char **environint main()
{//execve 创建一个子进程,在子进程里执行文件execve("new2",argv,environ);cout << "正常情况不输出" << endl;return 0;
}/*new2.c文件*/
#include <sys/types.h>
#include <unistd.h>
#include <iostream>using namespace std;int main()
{puts("this is new2");return 0;
}
#include <sys/types.h>
#include <unistd.h>
#include <iostream>using namespace std;int main(int argc,char* argv[])
{//vi 的等效用法if(argc < 2){cout << "vi 的等效用法" << endl;cout << "filename" << argv[0] << endl;return -1;}execlp("/bin/vi","vi",argv[1],(char*)NULL);return 0;
}
  1. 等待进程

wait():函数首先判断进程是否存在,不存在直接退出并且提示错误;
进程存在则将父进程挂起,直到子进程结束。

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>using namespace std;int main()
{int status;pid_t pid;pid = fork();if(pid < 0){cout << "ERRO" << endl;exit(0);}else id(pid == 0){cout << "*******" << endl;exit(2);}//调用wait等待子进程结束if(wait(&status) != pid){cout << "parent process" << endl;exit(0);}
}
  1. 进程结束

exit() 和 _exit() 都没有返回值
fork() ⇒\Rightarrow⇒ exit()
vfork() ⇒\Rightarrow⇒ _exit()

文中代码和知识点来自《Linux C从入门到精通》

c语言进程创建、等待和退出相关推荐

  1. 【Linux系统编程】进程的控制:结束进程、等待进程结束

    结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 ret ...

  2. Linux进程创建fork、进程退出exit()、进程等待waitpid()

    虽然通过标题,我们就轻易的知道了这三个函数的作用,可是,你真的了解这几个函数码?下面让我们来看看这三个函数到底有什么! 一.进程创建fork() 首先,我们来看一看fork()的函数声明: #incl ...

  3. 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》

    前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...

  4. Linux:进程管理 | 进程创建 | 进程终止 | 进程等待 | 进程替换

    文章目录 进程创建 fork 写时拷贝机制 进程终止 退出码 进程退出方法 进程等待 阻塞.非阻塞的等待 进程替换 替换函数 exec l exec lp exec le exec ve exec v ...

  5. 【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)

    文章目录 一.进程创建 1.1 系统调用 fork 1.2 理解 fork 的返回值 1.3 写时拷贝策略 二.进程终止 2.1 main 函数的返回值 2.2 进程退出的几种情况 2.3 进程退出码 ...

  6. 【Linux】进程控制 —— 进程创建/终止/等待

    目录 一.进程创建 1.fork创建子进程,操作系统做了什么? 2.fork的用法以及失败的原因 二.进程终止 1.三种退出情况 2.main函数为什么一般情况下都要return 0 3.进程的退出码 ...

  7. 【Linux】进程创建、进程终止、进程等待

    目录 一.进程创建 1.1 深入 fork 函数 1.2 写时拷贝 二.进程终止 2.1 进程退出码 2.2 exit 与 _exit 三.进程等待 3.1 进程等待必要性 3.2 进程等待 3.2 ...

  8. C语言实现Linux系统的守护进程创建

      大家好,我是练习编程时长两年半的昆工第一ikun,今天我们来分享一下进程的有关知识,并且用c语言来创建一个Linux系统的守护进程. 目录 一.进程相关接口函数 1.创建子进程 -- fork ( ...

  9. 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )

    文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...

最新文章

  1. get,put,post,delete含义与区别
  2. Google 前员工:秘密研究中国搜索项目或会引发离职潮!
  3. 本田加入通用+Cruise组合,老牌汽车制造商“抱团”发展自动驾驶技术
  4. 【量子信息与量子计算简明教程|陈汉武】阅读笔记1——第一章 量子信息与量子计算的基础概念
  5. window环境mysql卸载不干净
  6. 今日头条php笔试题,今日头条笔试题回顾及个人答案参考
  7. 求解-----组合优化问题
  8. 关于键盘(总论8042)
  9. IDEA将后端代码上传至远程服务器
  10. 测试测量 | 【一】如何实现生产过程中的自动化测试?——成功的自动测试系统的目标及面临的问题
  11. docker中报错Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirro
  12. 今年考研?七夕顺便把心形线复习一下
  13. python getcwd_Python3 os.getcwd() 方法
  14. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中
  15. html5 中input type=‘file’实现文件图片等的上传的文件类型限制
  16. 多路PT100转RS485模块
  17. 发送腾讯云短信所依赖的完整jar包
  18. int *p=malloc(100); 求 sizeof(p)
  19. Java求职记录(20年-重庆/成都)
  20. 三子棋(N子棋)游戏的保姆级超详细教程(C语言)

热门文章

  1. springboot启动访问页面提示404
  2. java poi 导出excel模版
  3. Excel 表格如何添加计算并发数公式
  4. 《21st Century C, 2nd Edition》译者序
  5. ClickHouse Query执行流程浅析
  6. Java调用WebService短信接口
  7. Netflix 停止 APP 内付费绕开苹果税;百度开除虚假报销打车票员工 55 人
  8. 卡尔曼滤波物体轨迹预测趣味实战
  9. 腾讯狂砸2亿,给1万多员工送华为折叠屏手机! 市价2万一台且断货
  10. 伊顿将在汉诺威国际商用车展上重点推介可持续商用车技术