IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [操作系统自由练习] 进程的同步lockf()函数 -> 正文阅读

[C++知识库][操作系统自由练习] 进程的同步lockf()函数

目录

例一

?

分析

例二

分析

lockf()

参考


例一

#include<stdio.h> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
#include<unistd.h>
?
{
 ? ?int p1, p2, i;
 ? ?while((p1=fork())==-1);
 ? ?if(p1 == 0){
 ? ? ? ?printf("1, pid=%d\n", getpid());
 ? ? ? ?for(int i = 0; i < 10; i ++)
 ? ? ? ? ? ?printf("daughter\n");
 ?  }else{
 ? ? ? ?while((p2=fork())==-1);
 ? ? ? ?if(p2 == 0){
 ? ? ? ? ? ?printf("2, pid=%d\n", getpid());
 ? ? ? ? ? ?for(int i = 0; i < 10; i ++)
 ? ? ? ? ? ? ? ?printf("son\n");
 ? ? ?  }else{
 ? ? ? ? ? ?printf("0, pid=%d\n", getpid());
 ? ? ? ? ? ?for(int i = 0; i < 10; i ++)
 ? ? ? ? ? ? ? ?printf("parent\n");
 ? ? ?  }
 ?  }
 ? ?return 0;
}

?

分析

(图一)父进程(pid=51446)先后创建子进程1(pid=51447)和子进程2(pid=51448)

分别输出了 parent, daughter, son

并且在他们各自输出的时候, IO这一资源对于三个进程均可用, 多次运行该程序会看到如下交替输出的情况

?

例二

#include<stdio.h>
#include<unistd.h> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
main() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 ? ?int p1, p2, i; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
 ? ?while((p1=fork())==-1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 ? ?if(p1 == 0){
 ? ? ? ?lockf(1, 1, 0);//加锁
 ? ? ? ?printf("1, pid=%d\n", getpid());
 ? ? ? ?for(int i = 0; i < 10; i ++)
 ? ? ? ? ? ?printf("daughter\n");
 ? ? ? ?lockf(1, 0, 0);
 ?  }else{
 ? ? ? ?while((p2=fork())==-1);
 ? ? ? ?if(p2 == 0){
 ? ? ? ? ? ?lockf(1, 1, 0);
 ? ? ? ? ? ?printf("2, pid=%d\n", getpid());
 ? ? ? ? ? ?for(int i = 0; i < 10; i ++)
 ? ? ? ? ? ? ? ?printf("son\n");
 ? ? ? ? ? ?lockf(1, 0, 0);
 ? ? ?  }
 ?  }
}

?

分析

父进程(pid=51716)先后创建子进程1(pid=51717)和子进程2(pid=51718)

与例一不同的是, 这里使用了lockf(), 对IO加锁, 不会再出现交替输出的情况, 实现互斥

  • 这里的lockf(1, 1, 0) 锁定的屏幕的输出, 其他进程此时无法输出

  • lockf(1, 0, 0)解锁屏幕输出

lockf()

函数原型

int lockf(int fd, int cmd, off_t len);

  • fd为通过open返回的打开文件描述符。

  • cmd的取值为:

    • F_LOCK:给文件互斥加锁,若文件以被加锁,则会一直阻塞到锁被释放。

    • F_TLOCK:同F_LOCK,但若文件已被加锁,不会阻塞,而回返回错误。

    • F_ULOCK:解锁。

    • F_TEST:测试文件是否被上锁,若文件没被上锁则返回0,否则返回-1。

  • len:为从文件当前位置的起始要锁住的长度。

?

?可见进程终止时,他所建立的所有文件锁都会被释放(虽然子进程没解锁, 但是父进程最后还是完成输出操作)

参考

>>>linux中fcntl()、lockf、flock的区别-lvyilong316-ChinaUnix博客

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:03:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 2:33:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码