OS fork 练习

13 篇文章 4 订阅

练习

1

编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上打印一个字符:例如父进程打印’a’,一个子进程打印字符’b’,另一个子进程打印字符’c’。多次执行程序,观察并记录屏幕上的显示结果,是否有不同,将你的实验结果写入实验报告。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    int pid;
    pid=fork();
    if (pid != 0) {
        printf("a\n",pid);
    } else {
        printf("b\n");
        pid = fork();
        if (pid != 0) {
            printf("c\n",pid);
        } else {
            printf("c\n");
        }
    }
    return 0;
}
[root@Cai 1]# ./1
abcc

我们在里面加一点东西

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    int pid;
    pid=fork();
    if (pid != 0) {
        printf("父进程,子进程为:%d a\n",pid);
    } else {
        printf("子进程,b\n");
        pid = fork();
        if (pid != 0) {
            printf("父进程,子进程为:%d c\n",pid);
        } else {
            printf("子进程,c\n");
        }
    }
    return 0;
}
[root@Cai 1]# ./1
父进程,子进程为:28742 a
[root@Cai 1]# 子进程,b
父进程,子进程为:28743 c
子进程,c

2

修改上述程序,每一个进程循环10次打印一句话。例如一个子进程打印’daughter…‘另一个子进程打印’son…’,父进程打印 ‘parent…’,多执行几次,观察并记录屏幕上的显示结果,是否有不同,将你的实验结果写入实验报告。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    int pid, i;
    pid=fork();
    if (pid != 0) {
        for (i=0; i<10; i++) printf("parent\n");
    } else {
        for (i=0; i<10; i++) printf("son\n");
    }
    return 0;
}

结果都是parent在先,son在后,没有交替的情况(个人情况)

3

利用vi编辑器,创建源代码文件t1.c,内容如下

#include <stdio.h>
#include <unistd.h>
int main ()
{
    printf("hello...");
    fork();
    return 0;
}
[root@Cai 3]# ./test
hello...[root@Cai 3]# hello...

一般来讲,fork是从这句话之后的语句开始执行两次,但是由于printf并不是立即输出,即先存在缓存区中再输出,fork的时候还没有输出,所以fork直接拷贝了缓存区,在最后的时候进行输出

4

利用vi编辑器,创建源代码文件ft1.c,内容如下

#include <stdio.h>   
int main(void) 
{    
 int i;    
 for(i=0; i<2; i++)
 {       
     fork();       
     printf("-");    
 }      
 return 0; 
}        
[root@Cai 4]# ./test
--[root@Cai 4]# ------

画一个图

i=0
i=0
i=1
i=1
i=1
i=1
-
-
--
--
--
--

fork会将之前缓存区里的--进行复制,所以是8个

5

拷贝并修改ft1.c为ft2.c,内容如下

#include <stdio.h>   
int main(void) 
{    
 int i;    
 for(i=0; i<2; i++)
 {       
     fork();       
     printf("-\n");    
 }      
 return 0; 
}
[root@Cai 5]# ./test
-
-
[root@Cai 5]# -
-
-
-

读取到换行结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值