OS fork 练习

Posted 霜序0.2℃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OS fork 练习相关的知识,希望对你有一定的参考价值。

练习

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
-
-
--
--
--

fork会将之前缓存区里的--进行复制

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]# -
-
-
-

fork会将第二个换行符号之后的复制

以上是关于OS fork 练习的主要内容,如果未能解决你的问题,请参考以下文章

以python代码解释fork系统调用

golang 进程创建,fork,以及热重启(无缝升级)

os.fork()----linux

OS之os.fork()

多个fork()

C#程序员经常用到的10个实用代码片段