一)概述:

  1)纯文本文件是一种原始但却高效的进程间通信方式,当两个不同步执行的进程必须要进行通信时,文件或许是进行IPC的唯一选择.

  2)一般来讲通过纯文本文件在多个进程之间进行过渡,传输数据,而gcc编译程序就是一个例子,它会生成中间文件,最后再将其删除.

  3)当两个进程使用文件进行通信时,无法保证当一个进程在读的时候,另一个进程没有去写,下面的例子用于说明这个问题.

  二)文本文件的IPC和lockf函数

  源程序1如下:

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  #include <unistd.h>

  #include <sched.h>

  #include <sys/wait.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");

  char buf[32];

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

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

  fclose(fp);

  }

  void parent(void)

  {

  FILE *fp = fopen(filename, "w");

  if (fp == NULL)

  error_out("parent:fopen");

  fprintf(fp, "Hello world");

  fclose(fp);

  }

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

  {

  pid_t pid = fork();

  if (pid == 0){

  child();

  }

  else{

  parent();

  int status = 0;

  int r = wait(&status);

  if (r == -1)

  error_out("parent:wait");

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

  unlink(filename);

  }

  exit(0);

  }

  gcc file-ipc-naive.c -o file-ipc-naive

  当运行时返回下面的错误信息

  ./file-ipc-naive

  child:fopen: No such file or directory

  child status=1

  我们来分析一下上面的程序,程序运行后即执行了fork,此时派生了子进程,执行了child();而父进程执行了parent();

  子进程通过fopen(filename, "r")试图打开messagebuf.dat文件,而此时如果父进程没有执行到fopen(filename, "w"),这时程序就会报上面的错误.

  而如果我们通过strace运行file-ipc-navie这个程序,返回的结果也许会不同,如下:

  strace -o strace.out -f ./file-ipc-naive

  child read: Hello world;

  child status=0

  原因在于用strace监视程序运行时,有充足的时间让程序可以输出正确的结果,但不是每次都能得到正确的输出.

  为解决这个问题,我们可以用lockf函数对文件进行锁定控制.

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

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

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

    三)强制性加锁的实现 1)对文件加锁有两种方式:劝告性锁和强制性锁. 2)劝告性锁工作时,每个进程都要对文件进行读或写之前调用lockf对文件加锁,如果一个进程忘记调用lockf,那么锁协议将会被忽视 ...

  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. jdbcdslog hibernate sql log
  2. 很多人问,到底要不要转管理
  3. [USACO1.2]回文平方数 Palindromic Squares
  4. electron、node
  5. 关于lock_guard使用细节
  6. 用truffle部署智能合约到以太坊网络(truffle+infura)的简易方法
  7. 亚马逊EC2服务器使用Rsync+Inotify实时同步
  8. thymeleaf模板引擎使用iframe的解决方案
  9. Python语言程序设计 第七周 文件和数据格式化
  10. easyUI的iconCls
  11. 外汇兑换人民币业务的居民
  12. 2020电子信息夏令营(湖大,吉大,中山,武大,浙大)
  13. 软件测试面试智商题,程序员面试时遇智商测试题:15分钟内答对这3题,你的IQ可以碾压大多数人!...
  14. Android sim卡 pin码解锁流程.
  15. python Stark 组件
  16. 【精品】机器学习模型可解释的重要及必要性
  17. Android之——手机黑名单的实现
  18. 《宝岛双雄》曝正式海报 房祖名挑大梁的银幕转型之作
  19. 计算机一级考试题电子表格,2017计算机一级Excel模拟考试题
  20. Android 报错A/libc: Fatal signal 6 (SIGABRT), code -6 in tid *** 解决

热门文章

  1. element ui select 自动向上向下弹出_达观数据:Selenium使用技巧与机器人流程自动化实战...
  2. java字符串拼接_Java 8中字符串拼接新姿势:StringJoiner
  3. 上海黑马JAVA30期_2018年4月最新黑马Javaee第297期
  4. Java中的SPI(Service Provider Interface介绍及示例
  5. Python编程基础05:运算符与表达式
  6. Java讲课笔记11:构造方法与this关键字
  7. Java讲课笔记07:计数循环与嵌套循环
  8. 【BZOJ4600】硬币游戏,博弈
  9. php 热点图,JavaScript_javascript如何写热点图,在gis中,你如果用js来写热点 - phpStudy...
  10. java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)