操作系统实验笔记(四)-linux下进程管理之通信管理
进程管理之通信管理
目录:
基础知识的补充
实验代码
实验分析
1.基础知识补充
int lockf(int fd, int cmd, off_t len);
①fd 是打开文件的文件描述符。
为通过此 函数调用建立锁定, 文件描述符必须使用只写权限(O_WRONLY)或读写权限(O_RDWR)打开。如果调用进程是具有PRIV_LOCKRDONLY 权限的组的成员,它也可以使用lockf()来锁定使用只读权限(O_RDONLY)打开的文件。
②cmd 是指定要采取的操作的控制值,允许的值在中定义。
如下所示:
# define F_ULOCK 0 //解锁
# define F_LOCK 1 //互斥锁定区域
# define F_TLOCK 2 //测试互斥锁定区域
# define F_TEST 3 //测试区域
F_ULOCK 请求可以完全或部分释放由进程控制的一个或多个锁定区域。如果区域未完全释放,剩余的区域仍将被进程锁定。如果该表已满,将会返回[EDEADLK]错误,并且不会释放请求的区域。
使用 F_LOCK 或 F_TLOCK 锁定的区域可以完全或部分包含同一个进程以前锁定的区域,或被同一个进程以前锁定的区域包含。此时,这些区域将会合并为一个区域。如果请求要求将新元素添加到活动锁定表中,但该表已满,则会返回一个错误,并且不会锁定新区域。
F_LOCK 和 F_TLOCK 请求仅在采取的操作上有所差异(如果资源不可用)。如果区域已被其他进程锁定,F_LOCK 将使调用进程进入 休眠状态,直到该资源可用,而 F_TLOCK 则会返回[EACCES]错误。
F_TEST 用于检测在指定的区域中是否存在其他进程的锁定。如果该区域被锁定,lockf()将返回 0,否则返回−1;在这种情况下,errno 设置为[EACCES]。F_LOCK 和 F_TLOCK 都用于锁定文件的某个区域(如果该区域可用)。F_ULOCK 用于 删除文件区域的锁定。
③len是要锁定或解锁的连续字节数。
要锁定的资源从文件中当前偏移量开始,对于正 len 将向前扩展,对于负 len 则向后扩展(直到但不包括当前偏移量的前面的字节数)。如果 len 为零,则锁定从当前偏移量到文件结尾的区域(即从当前偏移量到现有或任何将来的文件结束标志)。要锁定一个区域,不需要将该区域分配到文件中,因为这样的锁定可以在文件结束标志之后存在。
使用 S_ENFMT 文件模式的常规文件(未设置组执行位)将启用强制策略。启用强制策略后,如果清除了 O_NDELAY,访问锁定区域的读取和写入将进入 休眠状态,直到整个区域可用为止,但是如果设置了O_NDELAY,将会返回−1并设置 errno。由其他系统函数(如 exec())访问的文件不受强制策略的影响。
2.实验代码
# include<unistd .h>
# include<signal.h>
# include<stdio.h>
int pid1,pid2;
main()
{
int fd[2];//其中fd[0]是读入文件,fd[1]是写入文件
char OutPipe[100],InPipe[100];
pipe(fd);//
while((pid1=fork())== -1);//fork()返回 -1失败 0当下进程 〉0返回进程号
if(pid1==0)//对子进程p1进行操作
{
printf("p1\n");
lockf(fd[1],1,0);//上锁
sprintf(OutPipe,"child 1 process is sending message!");//并不是输出,而是存入字符串
write(fd[1],OutPipe,50);
sleep(5);//f在子进程 读完之后进行父进程的写操作
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork())== -1);
if(pid2==0)
{
printf("p2\n");
lockf(fd[1],1,0);
sprintf(OutPipe," child 2 process is sending message!");
write(fd[1],OutPipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
printf("parent\n");
wait(0);//保证同步
3.实验小结:
read(fd[0],InPipe,50); printf("%s\n",InPipe); wait(0); read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0);}}}
int lockf(int fd, int cmd, off_t len);
①fd 是打开文件的文件描述符。
为通过此 函数调用建立锁定, 文件描述符必须使用只写权限(O_WRONLY)或读写权限(O_RDWR)打开。如果调用进程是具有PRIV_LOCKRDONLY 权限的组的成员,它也可以使用lockf()来锁定使用只读权限(O_RDONLY)打开的文件。
②cmd 是指定要采取的操作的控制值,允许的值在中定义。
如下所示:
# define F_ULOCK 0 //解锁
# define F_LOCK 1 //互斥锁定区域
# define F_TLOCK 2 //测试互斥锁定区域
# define F_TEST 3 //测试区域
F_ULOCK 请求可以完全或部分释放由进程控制的一个或多个锁定区域。如果区域未完全释放,剩余的区域仍将被进程锁定。如果该表已满,将会返回[EDEADLK]错误,并且不会释放请求的区域。
使用 F_LOCK 或 F_TLOCK 锁定的区域可以完全或部分包含同一个进程以前锁定的区域,或被同一个进程以前锁定的区域包含。此时,这些区域将会合并为一个区域。如果请求要求将新元素添加到活动锁定表中,但该表已满,则会返回一个错误,并且不会锁定新区域。
F_LOCK 和 F_TLOCK 请求仅在采取的操作上有所差异(如果资源不可用)。如果区域已被其他进程锁定,F_LOCK 将使调用进程进入 休眠状态,直到该资源可用,而 F_TLOCK 则会返回[EACCES]错误。
F_TEST 用于检测在指定的区域中是否存在其他进程的锁定。如果该区域被锁定,lockf()将返回 0,否则返回−1;在这种情况下,errno 设置为[EACCES]。F_LOCK 和 F_TLOCK 都用于锁定文件的某个区域(如果该区域可用)。F_ULOCK 用于 删除文件区域的锁定。
③len是要锁定或解锁的连续字节数。
要锁定的资源从文件中当前偏移量开始,对于正 len 将向前扩展,对于负 len 则向后扩展(直到但不包括当前偏移量的前面的字节数)。如果 len 为零,则锁定从当前偏移量到文件结尾的区域(即从当前偏移量到现有或任何将来的文件结束标志)。要锁定一个区域,不需要将该区域分配到文件中,因为这样的锁定可以在文件结束标志之后存在。
使用 S_ENFMT 文件模式的常规文件(未设置组执行位)将启用强制策略。启用强制策略后,如果清除了 O_NDELAY,访问锁定区域的读取和写入将进入 休眠状态,直到整个区域可用为止,但是如果设置了O_NDELAY,将会返回−1并设置 errno。由其他系统函数(如 exec())访问的文件不受强制策略的影响。
相关文章
- linux下Shell编程--标准的守护进程的启动脚本
- Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()
- [linux]Linux下的log
- Linux中怎么通过PID号找到对应的进程名及所在目录
- python-django-linux上mysql的安装和配置_20191124
- 【学习总结】快速上手Linux玩转典型应用-第2章-linux简介
- How to use udev for Oracle ASM in Oracle Linux 6 怎样使用udev在linux 6系统上使用asm
- Linux - 查看进程状态
- linux shell判断当前目录下的文件或目录
- linux Hadoop HDFS NameNode进程重启脚本(linux进程通用)
- 【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
- Linux下Tomcat重新启动
- linux 通过哪个命令可以查看某个服务及其端口、进程号
- linux学习之八---Linux进程基础知识
- L81.linux命令每日一练 -- 第11章 Linux系统管理命令 -- ethtool和mii-tool
- L73.linux命令每日一练 -- 第十章 Linux网络管理命令 -- dig和host
- L63.linux命令每日一练 -- 第九章 Linux进程管理命令 -- runlevel、init和service
- 嵌入式Linux开发,Ubuntu22下交叉编译报错:arch64-linux-gnu-gcc: error while loading shared libraries: libstdc++.so.
- 嵌入式Linux开发,Ubuntu22下交叉编译报错:make[1]: aarch64-linux-gnu-gcc: No such file or directory
- linux 下监控某个进程的脚本-以frp为例
- Linux- 系统随你玩之--文本、字符串处理摸金校尉--RE
- Linux:僵尸进程 Zombie
- 你了解Linux编译器gcc的使用吗?