㈠ linux下的fork函数
不止三个,子进程仍然在循环体内,所以子进程也会根据它的i值来做循环,然后fork子进程的子进程,但是你的程序也有问题,父进程打印后没有等待子进程运行结束就return了,这样有些子进程还来不仅运行就退出了。所以你的程序的输出结果是不可靠的,也是可能是随机的(其结果会根据运行时操作系统的具体调度的不同而不同)。所以我给你改了一下,这样就能让所有被fork的子进程(包括这些子进程再次fork出来的子进程)都有机会运行。
int main()
{
int i;
int my_pid;
int chld_pid;
for( i= 0; i< 3; i++)
{
chld_pid= fork();
if(chld_pid== 0) {
my_pid = getpid();
printf("i = %d, child pid %d\n", i, my_pid);
}
else {
my_pid = getpid();
printf("i = %d, parent pid %d, child pid %d\n",i, my_pid, chld_pid);
wait(0); /*waiting for the completion of child */
}
}
return 0;
}
运行后的结果为:
i = 0, parent pid 5294, child pid 5295
i = 0, child pid 5295
i = 1, parent pid 5295, child pid 5296
i = 1, child pid 5296
i = 2, parent pid 5296, child pid 5297
i = 2, child pid 5297
i = 2, parent pid 5295, child pid 5298
i = 2, child pid 5298
i = 1, parent pid 5294, child pid 5299
i = 1, child pid 5299
i = 2, parent pid 5299, child pid 5300
i = 2, child pid 5300
i = 2, parent pid 5294, child pid 5301
i = 2, child pid 5301
这样你就可以看到,实际上有7个子进程被fork出来,其中有3个是被真正的父进程(5294)fork出来的,而其余的则是被5294的子进程(甚至子进程的子进程)所fork出来的。其中的逻辑关系从打印出来的进程号就可以一目了然了,我就不赘述了。
㈡ 关于linux c 下fork的用法
简单的说,自 fork 调用之后的代码,父子进程均是可见的
你的程序里面,子进程在执行了 "i am in child" 之后,也做了一次
if < 0 ... else "in parent"
所以打了两遍
正确的写法应该是
pid = fork();
if (pid < 0) {
// 异常处理
}
if (0 == pid) {
// 父进程
} else {
// 子进程
}
对比一下就明白了
㈢ 请教linux下fork()创建子进程
pid = fork(); //创建进程命令点
if(pid < 0){...} //pid<0,表示fork出错,程序一般会退出,不会出现pid=0和pid>0的情况
else if(0 == pid){...} //从这个点开始,程序出现分支 pid=0表示fork出来的子进程分支
else{....} //否则是原进程,即父进程
printf("here!"); //如果在上面两个进程都没有exit()操作时,执行完{}中的命令,都会走到这里
关于fork出来的父子进程关系,请仔细阅读linux高级编程中进程一章节,内容很多,细细的阅读并练习体会吧
㈣ linux中的fork是创建进程还是线程
fork是创建进程,pthread是线程。
㈤ 关于Linux的fork()
= OR ==
你初学者吧,请把赋值 =
和 == 值比较 搞清楚啊
= value assignment
== value compare
㈥ linux 系统 fork函数
你好!
对于刚刚接触Unix/Linux操作系统,在Linux下编写多进程的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。
具体可以看我的文章http://blog.sina.com.cn/s/blog_590be5290100j14f.html
㈦ linux中的fork函数到底做了什么事
额........每启动一个进程并不一定要执行fork.fork只是系统最后封装的一个系统调用.你在程序里不使用fork的话.使用其它方式启动进程.就不是fork.fork族里有很多函数...............exec也可替换当前进程......系统内核里生成一个进程用的是clone这个函数.
就比如要盖个房子.一个人干,要先挖土再调水泥再摆砖头再盖墙这样一步一步做.但是如果有多个人.就是可以多个人同时做这些事,一个挖土,一个调水泥.一个摆砖头.这样就省了很多时间.进程也是如此.fork的作用就是创建新进程.
这么多人一起盖房子,总不能各自盖各自的,需要大家协调来做.不能土没挖好就摆砖,没放砖就抹水泥一样.这个时候需要一个工头来管理大家.工头通过每个人的名字来指挥每个人干活.进程就通过pid来指挥一个进程干活.工人需要知道自己的工头是谁,好向他报告碰到的情况.进程需要知道自己的父进程是谁报告自己的情况.
这样就明白fork为何要返回进程的id了吧?fork是不会返回父进程的id的.
工头找了一个新工人干活.从工头知道这个新工人的名字时刻开始,新工人就会投入这个团队一起干活了.fork返回pid的时候就表示这个进程在这个进程团队里了.工头可以直接告诉工人要干什么而不会让其他工人误以为这是自己的活.但是程序并没有这么智能.这个时候就需要有一个状态(if(!pid){....这是工人干的活...})表明这个工人的代码从什么位置开始,到什么位置结束.
㈧ linux中fork,source和exec的区别
fork是系统调用,用来创建子进程。
source 读取函数,读取配置文件的时候用,不创建子进程,也是'.'
exec是创建进程,但是是创建的进程取代原来的进程,
所以fork是继承皇位,exec是推翻皇朝;
比如安卓系统中:就是用exec进行rootfs切换的;因为他用的是busybox,所以真假rootfs之间的切换用exec的;
㈨ linux下的fork()运用
fork()创建一个子进程,fork()进入内核,调用一次返回两次,如果返回的pid == 0子进程先返回,如果pid > 0(此时返回的是子进程的pid),父进程先返回。至于子进程和父进程哪个先返回,要看内核的调度算法。输出次序乱序,都有可能。父进程和子进程是并发执行的。