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——销毁信号量,不需要第四个参数。