Linux进程创建及同步实验

操作系统原理也开课几周啦,终于迎来了第一次平时上机。此次上机,主要是体会一下子进程的创建及进程的同步,具体练习题目如下:
1、编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程输出不同的内容。试观察记录屏幕上的显示结果,并分析原因。
在这里插入图片描述在这里插入图片描述
首先,了解一下fork()函数。
fork()是系统调用中定义的一个函数,包含于头文件unistd.h中。一个现有进程(父进程)可调用它创建一个新的进程(子进程)。其返回一个pid_t类型的值,有三种情况:
(1)、子进程创建失败,返回-1;
(2)、在子进程中,返回0;
(3)、在父进程中,返回一个正值,即新创建的子进程的进程ID。
因此,可以通过返回值的正负,判断当前是父进程还是子进程。
多次运行程序,可发现三条语句输出的顺序不固定,即在fork之后,父进程、两个子进程的先后执行顺序是不确定的。这是因为此代码没有进程同步机制,先后执行顺序取决于内核的调度算法。从进程并发执行来看,各种情况均有可能,父进程与子进程的输出内容叠加在一起。

2、修改上述程序,每一个进程循环显示一句话。子进程显示’daughter …‘及’son ……’,父进程显示 ‘parent ……’,观察结果,分析原因。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
整体来看,这一题与第1题有些类似。可以看出,在每个进程内,循环依旧是顺序执行的,只是父进程、子进程的先后执行顺序不确定,各种情况均有可能。这是因为,函数printf()在输出字符串时不会被中断,因此,字符串内部输出顺序不变。而进程间并发执行的调度顺序是随机的,输出顺序受父、子进程抢占处理机的先后次序影响。

3、再调用exec()用新的程序替换该子进程的内容,并利用wait()来控制进程执行顺序。调用Exit()使子进程结束。
在这里插入图片描述
开始时,代码漏写了一个“-”,编译时报错“无法访问‘color’:没有那个文件或目录”,重新打开.c文档,补加“-”。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

同样的,先来了解一下exec(),wait(),exit()函数。
(1)、实际上,exec不是一个函数,而是一个函数族。子进程通过调用exec函数族,执行与父进程不同的程序。exec函数族的作用是,在正在运行的进程内部,根据指定的文件名和路径,找到可执行文件(既可以是二进制文件,也可以是Linux下可执行的脚本文件),并将进程执行的程序替换为新程序(只取代数据段、代码段和堆栈段,其余不变),新程序从main处开始执行。
该函数族包含于头文件<unistd.h>中,共有6个函数:
int execl(const char *path,const char *arg, …)
int execv(const char *path,char *const argv[])
int execle(const char *path,const char *arg,…,char *const envp[])
int execve(const char *path,char *const argv[],char *const envp[])
int execlp(const char *file,const char *arg,…)
int execvp(const char *file,char *const argv[])
程序中,我用的是execl()函数。语句execl(“/bin/ls”,”ls”,”-1”,”-color”,NULL);的作用是按倒序输出当前目录下所有文件和子目录。
(2)、wait()函数的作用是使父进程阻塞,等待子进程终止,总而做到进程同步。
(3)、exit()函数的作用是终止进程执行。通常,父进程在创建子进程时,在进程末尾写一条exit(),使子进程自我终止。其中,exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。

以上就是本次上机的内容啦,通过这次上机,我对于Linux进程创建及同步有了更深的认识,收获还是蛮大的。以后也要继续努力,不断在实践中增进对知识的理解与掌握呐。

参考博文
【1】https://blog.csdn.net/weixin_39924920/article/details/81047262
【2】https://blog.csdn.net/weixin_39282491/article/details/81046898

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值