Linux笔记 AS笔记 PHP笔记C笔记 FLASH 3D
返回首页
当前位置: 首页 > 开发笔记 > C笔记 >

Linux环境下的C语言编程基础——fork()

时间:2010-01-22 21:19来源:未知 作者:admin 点击:
fork函数可以创建新的系统进程,是LINUX环境下C语言的必备知识。
1、子进程对存储空间的复制
 
 (1) 使用文本编辑器输入源程序
 
输入如下源程序:
 
#include <sys/types.h>
 
#include <unistd.h>
 
#include <stdio.h>
 
 
 
int main(void)
 
{
 
    int x, i;
 
 
 
    printf("Input a initial value for i: ");
 
    scanf("%d", &i);
 
    while((x=fork())==-1);//创建一个子进程,止到创建成功
 
    if(x==0)         
 
    {
 
        printf("When child runs, i=%d\n", i);
 
        printf("Input a value in child: ");
 
        scanf("%d", &i);
 
        printf("i=%d\n", i);
 
    }
 
    else         
 
    {
 
        wait();
 
        printf("After child runs, in parent, i=%d\n", i);
 
    }
 
}
 
(2) 预测程序的执行结果
 
阅读程序,根据自己的理解,预期程序执行后的结果。
 
运行结果为:
 
Input a initial value for i:4
 
When child runs,i=4
 
Input a value in child:2
 
i=2;
 
Agter child runs,in parent,i=4
 
 
 
 (3) 实际执行结果分析
 
编译生成执行文件,执行后记录结果,说明与预期的结果是否一致。分析为什么是这样的结果。
 
运行结果为:
 
Input a initial value for i:4
 
When child runs,i=4
 
Input a value in child:2
 
i=2;
 
Agter child runs,in parent,i=4
 
 
 
结果分析:
 
父进程执行,输出Input a initial value for i:后IO中断,释放CPU,父进程进入阻塞状态,输入4完成后,父进程由阻塞状态,得到CPU后再次进入执行状态。执行while((x=fork())==-1);后,父进程创建一子进程,子进程复制了父进程的资源,成为独立于父进程的一个进程,并且子进程的fork()返回值为0,父进程的fork()返回值为刚创建的子进程号。系统先运行子进程,子进程的pid=fork()=0,进入if(pid==0)下的分支,进入该分支后,因出现IO中断,子进程释放CPU,进入阻塞状态,处于就绪状态的父进程得到CPU继续执行,因pid=fork()=子进程号,进入else分支,遇到wait()父进程释放CPU让子进程先执行完后再执行。
 
 
 
 2、父子进程执行过程分析
 
 (1) 按照给定框架编程
 
按照如下程序框架,完成源程序编写:
 
#include <sys/types.h>
 
#include <unistd.h>
 
#include <stdio.h>
 
int main(void)
 
{
 
// ①
 
Int pid=fork(); 
 
// ②  
 
if(pid==0)
 
{
 
                sleep(3);           
 
              printf("Child: pid=%d, ppid=%d\n", getpid(), getppid());         
 
}
 
else          
 
{  
 
         printf("Parent: Child=%d, pid=%d, ppid=%d\n", pid, getpid(), getppid());
 
              wait(); 
 
            printf("After Child ends.\n");       
 
}
 
printf("In which process?\n");      // ③
 
}
 
 (2) 预测程序的执行结果
 
阅读程序,根据自己的理解,预期程序执行后的结果。
 
 (3) 实际执行结果分析
 
编译生成执行文件,执行后记录结果,说明与预期的结果是否一致。分析为什么是这样的结果。
 
执行结果:
 
ParentLChild=12842,pid=12841,ppid=12811
 
Child:pid=12842,ppid=12841
 
In which process?
 
After Child ends.
 
In which process?
 
分析:
 
父进程执行,遇到fork()时,父进程创建一子进程,子进程复制了父进程的资源,成为独立于父进程的一个进程,并且子进程的fork()返回值为0,父进程的fork()返回值为刚创建的子进程号。系统先运行子进程,子进程的pid=fork()=0,进入if(pid==0)下的分支,进入该分支后,sleep(3);使子进程进入睡眠状态,释放CPU,此时处于就绪状态的父进程得到CPU进入执行状态,pid=fork()=子进程号,父进程进入else下的分支,输出子进程号12842、自身进程号12841,自身分进程号12811.之后执行wait(),父进程释放CPU让子进程先执行完。子进程此时还在睡眠状态,输出屏幕上会等待一会儿,即等待子进程醒来,之后输出子进程号12842、父进程号12841,最后子进程输出“In which process?”。子进程执行完成释放CPU,父进程获得CPU继续执行,输出“After Child ends.”,然后输出“In which process?”,父进程结束。
 
 (4) 修改程序并分析执行结果
 
把程序框架中最后一句输出语句(位置③处)分别移至位置①和②处,预期输出结果是什么?实际执行结果如何?分析原因。
 
#include <sys/types.h>
 
#include <unistd.h>
 
#include <stdio.h>
 
int main(void)
 
{
 
printf("A In which process?\n");
 
Int pid=fork(); 
 
printf("B In which process?\n"); 
 
if(pid==0)
 
{
 
                sleep(3);           
 
              printf("Child: pid=%d, ppid=%d\n", getpid(), getppid());         
 
}
 
else          
 
{  
 
         printf("Parent: Child=%d, pid=%d, ppid=%d\n", pid, getpid(), getppid());
 
              wait(); 
 
            printf("After Child ends.\n");       
 
}
 
}
 
 
 
运行结果:
 
A In which process?
 
B In which process?
 
Parent:Child=12915,pid=12914,ppid=12811
 
B In which process?
 
Child:pid=12915,ppid=12914
 
After Child ends.
 
分析:
 
当前进程执行,输出“A In which process?”,然后遇到fork(),父进程,即当前进程,创建一子进程,子进程复制了父进程的资源,成为独立于父进程的一个进程,并且子进程的fork()返回值为0,父进程的fork()返回值为刚创建的子进程号。系统先运行子进程,输出“B In which process?”,之后子进程的pid=fork()=0,进入if(pid==0)下的分支,进入该分支后,sleep(3);使子进程进入睡眠状态,释放CPU,此时处于就绪状态的父进程得到CPU进入执行状态,输出“B In which process?”pid=fork()=子进程号,父进程进入else下的分支,输出子进程号12815、自身进程号12814,自身分进程号12811.之后执行wait(),父进程释放CPU让子进程先执行完。子进程此时还在睡眠状态,输出屏幕上会等待一会儿,即等待子进程醒来,之后输出子进程号12815、父进程号12841。子进程执行完成释放CPU,父进程获得CPU继续执行,输出“After Child ends.”,父进程结束。
 
 
 
 (5) 修改程序验证父子进程关系
 
修改程序,使父进程先执行完成,验证子进程是否会一起终止?如果不是,前后子进程的父进程号是否变化?记录并分析结果。
 
#include <sys/types.h>
 
#include <unistd.h>
 
#include <stdio.h>
 
int main(void)
 
{
 
printf("A In which process?\n");
 
Int pid=fork(); 
 
printf("B In which process?\n"); 
 
if(pid==0)
 
{
 
                sleep(3);           
 
              printf("Child: pid=%d, ppid=%d\n", getpid(), getppid());         
 
}
 
else          
 
{  
 
         printf("Parent: Child=%d, pid=%d, ppid=%d\n", pid, getpid(), getppid());
 
                  printf("After Child ends.\n");       
 
}
 
}
 
程序修改:将else里的wait();语句去掉,即可保证父进程先于子进程执行完。
 
执行结果:
 
A In which process?
 
B In which process?
 
B In which process?
 
Parent: Child=12924,pid=12923,ppid=12811
 
After Child ends.
 
[root@localhost root]# Child:pid=12924,ppid=1
 
分析:
 

当前进程执行,输出“A In which process?”,然后遇到fork(),父进程,即当前进程,创建一子进程,子进程复制了父进程的资源,成为独立于父进程的一个进程,并且子进程的fork()返回值为0,父进程的fork()返回值为刚创建的子进程号。系统先运行子进程,输出“B In which process?”,之后子进程的pid=fork()=0,进入if(pid==0)下的分支,进入该分支后,sleep(3);使子进程进入睡眠状态,释放CPU,此时处于就绪状态的父进程得到CPU进入执行状态,输出“B In which process?”pid=fork()=子进程号,父进程进入else下的分支,输出子进程号12824、自身进程号12823,自身分进程号12811.,然后输出“After Child ends.”,父进程执行完,释放CPU,并把子进程抛给了最底层系统进程,进程号为1。子进程此时还在睡眠状态,进程号为1的父进程得到CPU后执行,输出“[root@localhost root]#”,提示用户输入命令,此时发生IO中断,进程号为1的父进程释放CPU。此时子进程醒来,之后输出子进程号12924、父进程号1。子进程执行完成释放CPU,父进程获得CPU继续执行,父进程结束。 

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
  • 上一篇:没有了
  • 下一篇:没有了
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容