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会将第二个换行符号之后的复制

Guess you like

Origin blog.csdn.net/Dueser/article/details/120906658