我是C程序员,第一次学习fork() , exec()和wait() 。 我也白板的标准C程序将在Linux上运行,并可能需要大量的subprocess。 我不能指望的是……有多less个subprocess对于一个父辈来说产卵然后等待呢?
假设我的代码如下所示:
pid_t status[ LARGENUMBER ]; status[0] = fork(); if( status[0] == 0 ) { // I am the child exec("./newCode01.c"); } status[1] = fork(); if( status[1] == 0 ) { // child exec("./newCode02.c"); } ...etc... wait(status[0]); wait(status[1]); ...and so on....
显然, LARGENUMBER越大,父母仍然在分岔或成为僵尸或其他人的机会越大。
所以这个实现对我来说似乎有问题。 据我了解,父母一次只能等一个孩子? 如果LARGENUMBER很大,并且运行状态[0] = fork(); 并等待(状态[0]); 是实质性的? 如果孩子跑了,变成了僵尸,那么在那个时候被操作系统终止了呢? 父母是否会永远等待(状态[0]) ?
你需要为新的操作系统build立一个新的编译器吗?
在创build新的systemd服务时,RemainAfterExit选项何时应该设置为true?
我是否需要在每个操作系统上安装JVM才能运行java软件或java编译的文件。
调度algorithm如何确定进程的types(I / O,cpu绑定)
通过pipe道进行进程间通信
在上面的例子中,对于LARGENUMBER的大小 ,必须有一些标准或指导。 还是我的方法都错了?
#define LARGENUMBER 1 #define LARGENUMBER 10 #define LARGENUMBER 100 #define LARGENUMBER 1000 #define LARGENUMBER ???
我想玩这个游戏,但是我的本能就是在将开发时间投入到可能或者不可行的程序之前征求build议。 任何意见/经验表示赞赏。
如何防止MMAPcaching值?
用户是否需要pipe理员权限才能安装Flash播放器?
针对多个版本的sql Server的软件testing
谁安排线程?
什么是可重入内核
我会尽我所能解释。
首先是一个不好的例子:在fork()一个子进程的地方,然后等待它完成之后再派生另一个子进程。 这会杀死多处理程度,坏的cpu使用率。
pid = fork(); if (pid == -1) { ... } // handle error else if (pid == 0) {execv(...);} // child else (pid > 0) { wait(NULL); // parent pid = fork(); if (pid == -1) { ... } // handle error else if (pid == 0) {execv(...);} // child else (pid > 0) {wait(NULL); } // parent }
应该怎么办? 在这种方法中,您首先创建两个子进程,然后等待。 提高cpu利用率和多处理程度。
pid1 = fork(); if (pid1 == -1) { ... } // handle error if (pid1 == 0) {execv(...);} pid2 = fork(); if (pid2 == -1) { ... } // handle error if (pid2 == 0) {execv(...);} if (pid1 > 0) {wait(NULL); } if (pid2 > 0) {wait(NULL); }
注意:
即使在执行第二次等待之前,似乎父母正在等待,孩子仍然在运行,并不等待执行或产生。
在你的情况下,你正在做第二种方法,先fork所有进程并保存fork返回值,然后等待。
父母一次只能等待()一个孩子?
父母可以一次一个地等待所有的孩子,无论他们是否已经完成并成为zombie process还是仍在运行。 更多的解释细节看这里 。
在变成不可行之前,父母可以产生多少个子进程?
它可能是操作系统的依赖,但一个可以接受的方法是将给定的流程分成两个运行时间,一个为子进程,另一个为父进程。 因此,流程不会耗尽系统,并通过创建子进程来进行欺骗,这些子进程将比操作系统想要首先提供父进程的运行更多。
如果你阅读wait的文件 ,你会知道的
如果状态信息在等待()之前可用,则立即返回。
这意味着,如果孩子已经终止, wait()将立即返回。 在您为子进程调用wait¹或程序退出之前,OS不会从进程表中删除信息:
如果父进程终止而不等待其所有子进程终止,则剩余的子进程将被分配与实现相关的系统进程对应的新父进程ID。
当然,你仍然无法产生无限数量的孩子,更多的细节请看Linux上的最大儿童进程数 (就Linux而言,其他操作系统将施加其他限制)。
¹: https : //en.wikipedia.org/wiki/Zombie_process
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。