Linux下创建进程简介
在博文https://blog.csdn.net/fengbingchun/article/details/108940548中简单介绍了Windows下通过函数CreateProcess创建进程的过程,这里简单介绍下Linux下通过fork函数创建进程的过程。很早之前在https://blog.csdn.net/fengbingchun/article/details/45690745中也曾介绍过。
进程创建的UNIX模型为分叉----执行(fork----exec)模型。fork函数调用生成一个完全复制父进程内存的子进程。exec函数调用以一个新的可执行文件替换当前进程。这两个调用通常一起使用,这样应用程序可调用fork函数创建一个新进程,然后该子进程直接调用exec函数以一个新的可执行文件替换自身。如果fork调用后面不跟exec调用,我们将有同一进程的两个副本。到进行分叉调用时这两个进程的进程状态是一样的。
子进程和父进程都会从fork函数调用返回,唯一的区别在于调用的返回值。子进程将返回零值,父进程将返回子进程的进程ID。fork函数不带任何参数,并返回一个整数值,返回负值,表示创建子进程失败。子进程和父进程在单独的内存空间中运行。子进程具有自己唯一的进程ID。子进程不会继承其父进程的内存锁。调用一次fork,却能够返回两次返回值,在子进程中,fork函数返回0,在父进程中,fork函数返回新创建子进程的进程ID。我们可以通过fork返回值来判断当前进程是子进程还是父进程。两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调动策略。一个进程通过调用wait来与它的子进程同步。
以下是测试代码段:
void test_fork_1()
{// reference: https://www.geeksforgeeks.org/fork-system-call/fork();fork();fork();// "hello"的打印次数等于创建的进程数,进程总数为2^n,其中n是fork调用的数目fprintf(stdout, "hello\n"); // 注:总共会输出8次hello
}
test_fork_1():总共会输出8次”hello”。”hello”的打印次数等于创建的进程数,进程总数为2^n,其中n是fork调用的数目。8次”hello”=1个主进程+7个子进程。执行结果如下图所示:
void test_fork_2()
{// reference: https://www.geeksforgeeks.org/fork-system-call/pid_t f = fork();// child process because return value zeroif (f == 0) {fprintf(stdout, "hello from child: parent pid: %d, my(child) pid: %d\n", getppid(), getpid());}// parent process because return value non-zeroelse if (f > 0) {fprintf(stdout, "hello from parent: my(parent) pid: %d\n", getpid());} else {fprintf(stderr, "unable to create child process\n");}
}
test_fork_2():”hello from child”和”hello from parent”两个输出是可能的,因为父进程和子进程同时运行。因此,我们不知道操作系统是先将控制权交给父进程还是子进程。父进程和子进程正在运行同一程序,但这并不意味着它们是相同的。操作系统为这两个进程分配不同的数据和状态,并且这些进程的控制流可以不同。执行结果如下图所示:
GitHub:https://github.com/fengbingchun/Messy_Test
Linux下创建进程简介相关推荐
- Windows下创建进程简介
正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一组值,如当前执行指令的地址.保存在内存中的值,以及唯一定义进程在任一时刻任务的所有其他值.进程与应用程序的 ...
- java 创建进程_Linux下创建进程简介
进程创建的UNIX模型为分叉----执行(fork----exec)模型.fork函数调用生成一个完全复制父进程内存的子进程.exec函数调用以一个新的可执行文件替换当前进程.这两个调用通常一起使用, ...
- linux下多进程编程简介
两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...
- linux下创建svn仓库及用户
1 Linux下创建svn仓库 1.1 启动SVN服务 svnserve -d -r /SVNRootDirectry 其中SVNRootDirectry是你的SVN 根目录,例如192.85.1. ...
- linux下查看进程的线程数,linux查看进程的线程数
top -H -p $PID #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...
- 查看linux进程的设备io,Linux下查看进程IO工具iopp
Linux下的IO检测工具最常用的是iostat,不过iostat只能查看到总的IO情况.如果要细看具体那一个程序点用的IO较高,可以使用iotop .不过iotop对内核版本和Python版本有要求 ...
- Linux创建进程必须fork么,Linux - fork() 创建进程
Linux - fork() 创建进程 Linux - fork() 创建进程 介绍创建进程之前,先简单地介绍一下 Linux 下的进程内存布局. Stack - 所有函数的 local variab ...
- 【Linux】从冯诺依曼体系到初识Linux下的进程
目录 前言 1.冯诺依曼体系结构 2.管理和操作系统 3.初识进程 1.描述进程PCB(process control block) 1.标识符pid fork接口创建子进程 2.进程状态 3.进程优 ...
- linux sftp创建多用户,Linux 下创建 sftp 用户并限定目录
Linux 下创建 sftp 用户并限定目录 1.创建 sftpUser 用户组 [root@XXX ~]# groupadd sftpUser 2.创建 sftpUser 用户并指定目录 [root ...
最新文章
- Spring in Action 4 读书笔记之使用标签创建 AOP
- 关于MSSQL数据存储的问题
- android studio crashlytics,完美解决Android Studio集成crashlytics后无法编译的问题
- Spring Social入门–第2部分
- mysql默认字符集和排序_MySQL字符集和排序规则
- android webview_在 Flutter 中使用 WebView
- java 上传断点续传_JAVA大文件上传断点续传解决方案
- CCF202012-4 食材运输(100分题解链接)
- 大道至简java伪代码
- 如何通过FTP从Mac快速发送和接收文件
- 77个互联网+大学生创新创业大赛文档
- 基于Hadoop的数据分析案例-陌陌聊天软件数据分析
- Socket通讯连接常见错误代码
- Python 按时间顺序读取所选目录下文件
- 【Linux】RHCE -- RHCSA 认证考试 模拟练习题解析
- 7-4 sdust-Java-学生成绩读取与排序 (35分)CSDN-markdown编辑器
- Hi3516DV300
- opencv 去除背景
- 机器学习模型训练测试完整步骤
- Spark使用RDD实现分组topN(八种方法)