Git   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用fork()在C(不是C ++)中创build3个孩子大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

嗨,我一直在制定一项计划,让孩子们分叉,然后再从每个孩子那里分娩更多的孩子,但这不是我需要帮助的。 当我运行我的程序(在这里它是一个function,但工作原理是一样的)我应该有一个父母(PPID)产卵3个孩子(PIDS = 1,2,3),但我得到的是相同的PID和PPID 3次(我现在的代码),或者在我得到3个父母之前,每个父母都有一个孩子,PPIDS与PIDS不同,但PPID与以前的孩子PID一样。 在我最近的尝试中,从不在父子(父亲)的信息上方显示孩子(儿子)。 它应该看起来像这样

[dad] hi am I PID 1234 and I come from ####(dont care what this number is) [son] hi i am PID 1111 and I come from PPID 1234 [son] hi i am PID 1112 and I come from PPID 1234 [son] hi i am PID 1113 and I come from PPID 1234

这是我的代码。 我只是寻找提示,如果可能的话,除非它只是一个愚蠢的错误,我已经做了像“哦,只是移动fork()到subprocess”或类似的东西。

我也有一个child_count,@R_537_9447@很容易地计数的孩子。

int forking(null) { void about(char *); int i=0; int j=0; int child_count =0; about("dad"); for(i = 0; i < 3; i++ ){ pid_t child = 0; child = fork(); if (child < 0) { //unable to fork error perror ("Unable to fork"); exit(-1);} else if (child == 0){ //child process about ("son"); printf("I am child #%d n",child_count); child_count++; exit(0);} else { //parent process (do nothing) } } for(j = 0; j < 3; j++ ){ wait(null);//wait for parent to ackNowledge child process } return 0; }

如何比较String中的字符与NASM x86_64 Linux程序集中的另一个字符

我可以启动一个脚本,使其独立于Linux上的父进程吗?

当python进程被杀死时杀死subprocess?

如何跟踪所有的后代进程清理?

如何检查JBoss是否在Unix服务器上运行?

想学习大会,困惑从哪里开始

在64位Windows应用程序中获取TID(线程信息块)的最快方法

Apache 2.4.23 PHP7.x Windows 10 x64 @L_944_18@无法正常工作

如何让ProcessBuilder处理嵌套的引号?

以编程方式监视使用C ++的进程状态

父母需要


– 打印一条消息


– 三次拨打电话


– 等三个孩子退出

每个孩子都需要


– 打印一条消息


– 出口

所以代码就像

int main( void ) { printf( "[dad] pid %dn",getpid() ); for ( int i = 0; i < 3; i++ ) if ( fork() == 0 ) { printf( "[son] pid %d from pid %dn",getpid(),getppid() ); exit( 0 ); } for ( int i = 0; i < 3; i++ ) wait( NULL ); }

生成这个输出

[dad] pid 1777 [son] pid 1778 from pid 1777 [son] pid 1779 from pid 1777 [son] pid 1780 from pid 1777

你必须记住的一件事是,当你fork ,父母和孩子都会继续在这个时候运行代码

所以,如果你不正确地做孩子/父母的检测,孩子们很可能会开始自己的孩子。

启动三个孩子而不是孙子孙女的一个方法是使用一个计数器连同从fork呼叫中返回的进程ID一起,如下所示:

#include <stdio.h> #include <unistd.h> #define COUNT 3 int main(void) { # Desired and actual count. int count = COUNT,children = 0; // Force parent initially. pid_t retpid = 1; // Only fork if limit not reached AND is parent (children // will exit loop with retpid == 0). while (count-- > 0 && retpid > 0) // Adjust actual count if successful. if ((retpid = fork()) > 0) children++; // Detect parent,all forks returned non-zero. if (retpid != 0) { printf("Parent %d spawned %d/%d childrenn",children,COUNT); // Wait for children to finish. while (children-- > 0) wait(null); } else { // Otherwise you were one of the children. printf("Child %d,sired by %dn",getppid()); } return 0; }

这会输出你似乎在之后,由于排序变幻莫测, 不一定按顺序:

Parent 26210 successfully spawned 3/3 children Child 26212,sired by 26210 Child 26213,sired by 26210 Child 26211,sired by 26210

检查返回的PID将确保只有父母做任何分派,并且计数将限制它到一个具体数量

你还需要注意的一件事是输出缓冲。 当你分叉时,你可能会得到两个缓冲输出数据的进程。

输出设备可以被检测为终端的情况下,通常会在输出换行符时发生刷新,所以printf调用可能不会重复正常运行的输出

例如,您只需要注意,如果将输出重定向文件,您可能会得到有趣的结果。

大佬总结

以上是大佬教程为你收集整理的使用fork()在C(不是C ++)中创build3个孩子全部内容,希望文章能够帮你解决使用fork()在C(不是C ++)中创build3个孩子所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: