linux实验

linux实验

linux编译运行C程序

1、创建一个文件夹:mkdir my;(假设文件名叫my)
2、进入该文件夹:cd my;
3、创建一个cpp文件:touch my.cpp;
4、对cpp文件进行编写:vim my.cpp
进入界面后输入i,然后输入代码语句
输入完成后,按键盘上的Esc,按住shift键并输入:,然后输入wq,保存并退出;
5、输入g++ -o my my.cpp对cpp文件进行编译;
6、运行cpp文件,输入./my

并发程序设计

创建子进程fork()

在这里插入图片描述

关键代码分析

if( fork( ) )判断进程是否创建成功
如果创建成功,fork()对子进程返回0,子进程执行else语句;
fork()对父进程返回子进程标识符(非0值)父进程执行if语句。

如果创建失败,fork()对父进程返回-1,父进程执行if语句;

预计实验结果

如果进程创建成功:
父进程连续输出35,35;子进程连续输出5,5
父进程第一次输出35,子进程第一次输出5,父进程第二次输出35,子进程第二次输出5;
父进程第一次输出35,子进程第一次输出5,子进程第二次输出5,父进程第二次输出35;
子进程连续输出5,5,父进程连续输出35,35;
子进程第一次输出5,父进程第一次输出35,子进程第二次输出5,父进程第二次输出35;
子进程第一次输出5,父进程第一次输出35,父进程第二次输出35,子进程第二次输出5;

如果进程创建失败:
父进程输出35,35

实际实验结果

在这里插入图片描述

结果分析

linux系统上父进程运行优先于子进程,子进程与父进程的运行时间小于一个时间片。

进程通信

进程执行图

在这里插入图片描述

PV操作设计

在这里插入图片描述

具体代码实现

邮箱创建:开辟共享内存作为邮箱

相关函数介绍:
1、shmget函数用来获取或创建共享内存
int shmget(key_t key, size_t size, int shmflg);
参数key是共享内存的键值, key_t类型,是共享内存在系统中的编号
参数size是待创建的共享内存的大小,以字节为单位。
参数shmflg是共享内存的访问权限,0666|IPC_CREAT表示全部用户对它可读写,如果共享内存不存在,就创建一个共享内存。

2、shmat把共享内存连接到当前进程的地址空间
void *shmat(int shm_id, const void *shm_addr, int shmflg);
参数shm_id是由shmget函数返回的共享内存标识。
参数shm_addr指定共享内存连接到当前进程中的地址位置
参数shm_flg是一组标志位
调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
在这里插入图片描述
在这里插入图片描述

信号量初始化:

相关函数介绍:
1.semget函数用来获取或创建信号量
int semget(key_t key, int nsems, int semflg);
参数key是信号量的键值,key_t类型
参数nsems是创建信号量集中信号量的个数
参数sem_flags是一组标志,如果希望信号量不存在时创建一个新的信号量,可以和值IPC_CREAT做按位或操作。
如果semget函数成功,返回信号量集的标识;失败返回-1,错误原因存于error中

2.semctl函数设置信号量的初始值int semctl(int semid, int sem_num, int command,… );
参数semid是由semget函数返回的信号量标识。
参数sem_num是信号量集数组上的下标,表示某一个信号量,填0。
参数cmd:填写SETVAL——初始化信号量的值,并输入第四个参数(共同体),完成初始化
在这里插入图片描述
在这里插入图片描述

P操作、V操作:

相关函数介绍:
semop函数
int semop(int semid, struct sembuf *sops, unsigned nsops);
参数semid是由semget函数返回的信号量标识。
参数nsops是操作信号量的个数
参数sops是一个结构体,如下:
struct sembuf
{
short sem_num; // 信号量集的个数,单个信号量设置为0。
short sem_op; // 信号量在本次操作中需要改变的数据:-1-等待操作;1-发送操作。
short sem_flg; // 把此标志设置为SEM_UNDO,操作系统将跟踪这个信号量。
};
在这里插入图片描述
在这里插入图片描述

邮件的读取方式说明

in为发送邮件的编号,初始值为0,每向B邮箱发送一次加1,并对邮箱最大容量10取余
out为接收邮件的编号初始值为0,每向B邮箱接收一次加1,并对邮箱最大容量10取余
例如,连续向B邮箱发送10封邮件,邮件编号为0-9,想继续发送,A进程被挂起,需要B进程从B邮箱取一封邮件解除挂起,既B进程将获取编号为0 文件内容,获取后,A进程将可再次在邮件0写入信息
最后,能实现先写的邮件先被获取。
在这里插入图片描述
在这里插入图片描述

进程通过输入0、1、2选择功能

A进程能实现send_B()向B邮箱发送邮件和receive_A()接收A邮箱邮件
B进程能实现send_A()向A邮箱发送邮件和receive_B()接收B邮箱邮件

在这里插入图片描述

删除共享内存和信号量

相关函数介绍:
shmctl函数删除共享内存
int shmctl(int shm_id, int command, struct shmid_ds *buf);
参数shm_id是shmget函数返回的共享内存标识符。
参数command填IPC_RMID。
参数buf填0

semctl函数销毁信号量
int semctl(int semid, int sem_num, int command );
参数semid是由semget函数返回的信号量标识。
参数sem_num是信号量集数组上的下标,表示某一个信号量,填0。
参数cmd:填写IPC_RMID——销毁信号量,不需要第四个参数。
在这里插入图片描述
在这里插入图片描述

效果演示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值