三)强制性加锁的实现

  1)对文件加锁有两种方式:劝告性锁和强制性锁.

  2)劝告性锁工作时,每个进程都要对文件进行读或写之前调用lockf对文件加锁,如果一个进程忘记调用lockf,那么锁协议将会被忽视

  3)强制性锁工作时,它将使任何一个想要访问已被加锁的文件的进程都堵塞在读或写队列上.加锁的过程是由内核强制启动的,所以不用担心不同步的进程忽视劝告性锁.

  4)程序2就是劝告性锁的典型例子,而下面的例子会演示强制性锁的使用.

  mount -o remount,rw,mand /dev/sdb1 /mnt/

  cd /mnt/

  chmod g-x messagebuf.dat

  chmod g+s messagebuf.dat

  修改程序2的源代码如下:

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  #include <unistd.h>

  #include <sched.h>

  #include <sys/wait.h>

  #include <sys/file.h>

  #include <sys/stat.h>

  const char *filename = "messagebuf.dat";

  void error_out(const char *msg)

  {

  perror(msg);

  exit(EXIT_FAILURE);

  }

  void child(void)

  {

  FILE *fp = fopen(filename, "r+");

  if (fp == NULL)

  error_out("child:fopen");

  /*int r = lockf(fileno(fp), F_LOCK, 0);

  if (r == -1)

  error_out("parent:lockf");*/

  char buf[32];

  fread(buf,sizeof(buf), 1, fp);

  if (ferror(fp))

  error_out("fread");

  printf("child read '%s'\n", buf);

  }

  void parent(FILE *fp)

  {

  fprintf(fp, "%#x", getpid());

  fflush(fp);

  int r = lockf(fileno(fp), F_ULOCK, 0);

  if (r == -1)

  error_out("lockf:F_ULOCK");

  fclose(fp);

  }

  int main(int argc, char *argv[])

  {

  int r;

  int fd = open(filename, O_CREAT|O_TRUNC|O_RDWR, 0666);

  FILE *fp = fdopen(fd, "r+");

  if (fp == NULL)

  error_out("parent:fopen");

  r = lockf(fileno(fp), F_LOCK, 0);

  if (r == -1)

  error_out("parent:lockf");

  pid_t pid = fork();

  if (pid == 0){

  child();

  exit(0);

  }

  else{

  int status = 0;

  parent(fp);

  wait(&status);

  printf("child status=%d\n", WEXITSTATUS(status));

  }

  exit(0);

  }

  gcc file-ipc-better.c -o file-ipc-better

  ./file-ipc-better

  child read '0x9a0'

  child status=0

  我们注释掉了子进程的lockf函数的过程,这时如果没有强制锁,子进程的读操作,将会忽视父进程的lockf,而我们加了强制锁,子进程的读操作被阻塞了.

  最终的结果同第二个程序一样,但我们却使用了不同的锁机制.

  最后使用文件进行传递媒介就意味着你可能遇到媒介中存在的潜在不安全因素.

转载于:https://blog.51cto.com/xuanjicto/725324

linux进程通讯-纯文本文件相关推荐

  1. linux进程通讯-纯文本文件1

    一)概述: 1)纯文本文件是一种原始但却高效的进程间通信方式,当两个不同步执行的进程必须要进行通信时,文件或许是进行IPC的唯一选择. 2)一般来讲通过纯文本文件在多个进程之间进行过渡,传输数据,而g ...

  2. 面试 linux 进程通讯,【转】LINUX驱动的经典面试问题...

    问:驱动程序分成上半部和下半 部,具体讲讲? 答:(当时我把中断处理程序的上下半部给答了)下半部是处理一些推后的工作,举个例子吧,比如网卡驱动,当有数据包到达网卡的时候,就会产生中断,然后一 个特定的 ...

  3. Linux 进程间通讯详解一

    进程间的通讯 两台主机间的进程通讯 --socket一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量, ...

  4. Linux 进程间通讯(IPC)方式 ------- 共享内存

    Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...

  5. Linux 进程间通讯方式 pipe()函数

    Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6-&g ...

  6. (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】

    Linux 进程 和 线程 的基本 编程.通讯 和 例程 注:[杂记]系列为日常网搜资料的堆砌而积累成之.如有错误恭谢指出.标识为"原创"其实不完全是,只是多引用再整理和加上自己的 ...

  7. linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道

    Linux进程间通讯的方式: 1. 管道(pipe)和有名管道(FIFO). 2. 信号(signal) 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字(socket) 管道通讯: 无名管 ...

  8. 吉林大学操作系统上机(实验一:Linux进程与线程通讯)

    前言 我希望找到这里的学弟学妹能基于我的内容完成的更好,这里的代码和思路应该是你们的下限!! 我分享这些笔记的初衷是因为我觉得csdn上与之相关的不少博客都收费,但是我当时做的时候,我觉得就那么一点东 ...

  9. Linux 进程和计划任务管理

    文章目录 1. 前言 2. 进程 2.1 什么是进程 2.2 程序和进程的关系 2.3 进程,线程和协程 2.4 进程常用管理命令 (1) ps (2) top (3) pgrep (4) pstre ...

最新文章

  1. 软件行业项目经理主要的职责是什么?(转)
  2. Enable PowerShell script execution policy
  3. SSM项目的数据库密码加密方案
  4. 操作系统实验4—磁盘调度
  5. mvn filter autoconfig 产生自动配置
  6. PHP的memory_limit
  7. javaScript第二天(2)
  8. 解决 Linux 端口被占用问题
  9. android 获取4g信号_5G与1G、2G、3G、4G有何不同
  10. 应对深度学习人才缺口,百度黄埔学院发起深度学习架构师培养计划...
  11. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)
  12. java查询出来的日期类型_Java的第29天,Oracle函数
  13. Zookeeper节点详解
  14. plsql破解版,plsql安装包
  15. 如何使用qq截图工具,却能保证系统不会随意放大
  16. 小鹏G3/G3i/P7/P5维修手册电路图用户手册维修诊断拆装技术资料
  17. QGIS快速提取建筑和道路矢量
  18. 执业兽医资格考试水生动物类题库
  19. iOS多线程的初步研究(三)-- NSRunLoop
  20. matlab 大学物理,Matlab在大学物理课程教学中的应用

热门文章

  1. android调节音量——AudioManager的应用
  2. 2013计算机系统导论,【精选】2013计算机系统导论-期末考卷-发布.pdf
  3. 纽大计算机博士,斑马博士捷报|纽约大学 (NYU) MSc Computer Engineering 计算机工程硕士录取...
  4. Linux RTC 驱动实验
  5. 怎么下载并安装python_怎么下载官网python并安装
  6. vb发送邮箱连接服务器失败,VB:如何用需要身份验证的SMTP邮件服务器发信
  7. c语言equal,C ++中的ratio_equal()示例
  8. jh锂电保护电路_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计
  9. matlab msgbox 换行,[转载]Matlab/GUI笔记
  10. 还在用 Notepad++吗? 盘点五款更好用的文本编辑器