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
    评论
### 回答1: Linux子进程同步实验是一种通过创建子进程来演示进程同步实验。在该实验中,进程子进程之间通过共享内存或管道等方式进通信,以达到同步的目的。通过该实验,可以深入了解进程同步的原理和实现方式,有助于提高对操作系统的理解和掌握。 ### 回答2: Linux是一个开源的操作系统,以其高效、稳定、安全等特点而闻名。在Linux中,进程是一个重要的概念,理解进程的概念对于理解Linux的工作原理至关重要。在Linux中,进程可以创建子进程子进程可以继承进程的资源,包括打开的文件和socket等,同时子进程也可以拥有自己的资源。而在子进程之间,同步是一个重要的问题。 为了解决这个问题,我们可以使用Pipes(管道),Pipes是一种进程间通信的方式,是一种数据流的机制。在Pipes中,数据是通过管道从一个进程传递到另一个进程,在Linux中,有两种Pipes,一种是普通的Pipes,一种是命名的Pipes。普通的Pipes只能用于子进程之间通信,而命名的Pipes可以用于任何进程之间的通信。 实现子进程同步实验可以采用以下步骤: 1. 创建一个进程和一个子进程。 2. 在进程创建一个管道,并将管道的读和写的文件描述符保存在一个数组中。 3. 进程向管道中写入一个字符。 4. 子进程从同一个管道中读取该字符。 5. 子进程向管道中写入一个字符。 6. 进程从同一个管道中读取该字符。 7. 验证读取的字符是否一致。 在上述步骤中,进程子进程通过管道进通信,实现了同步操作。这个实验可以帮助我们了解使用管道进进程间通信的基本原理和方法,并了解Linux进程同步机制。这对于学习高级Linux编程和操作系统原理有很大的帮助。 ### 回答3: Linux子进程同步实验主要是为了帮助我们深入了解进程间通信和同步的机制。在Linux中,进程是可以通过管道、共享内存、消息队列等方式进通信和同步的。 子进程同步实验可以通过fork()函数创建子进程来实现。当进程创建子进程后,进程子进程都会执同样的代码。如果需要在子进程之间进数据的传递,则可以使用管道或共享内存的方式实现。 在实验中,可以通过创建一个变量,让子进程分别对其进读写,从而实现进程之间的同步。如果进程先进写操作,则需要等待子进程读取完数据后,才能进读操作。如果子进程先进读操作,则需要等待进程写入完数据后,才能进写操作。 对于这个实验,可以先在进程创建一个共享内存。然后通过fork()函数创建子进程。在子进程中,通过共享内存来获取进程创建的变量的地址,从而进数据的读取和写入。在最后,通过销毁共享内存来结束整个实验。 总的来说,通过实验,我们可以加深对于进程间通信和同步的理解,同时也能更加熟练地掌握Linux系统编程的技能。通过实践和学习,我们可以更好地利用操作系统提供的机制,来实现相应的应用程序和系统服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值