linux进程通讯-纯文本文件1
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相关推荐
- linux进程通讯-纯文本文件
三)强制性加锁的实现 1)对文件加锁有两种方式:劝告性锁和强制性锁. 2)劝告性锁工作时,每个进程都要对文件进行读或写之前调用lockf对文件加锁,如果一个进程忘记调用lockf,那么锁协议将会被忽视 ...
- 面试 linux 进程通讯,【转】LINUX驱动的经典面试问题...
问:驱动程序分成上半部和下半 部,具体讲讲? 答:(当时我把中断处理程序的上下半部给答了)下半部是处理一些推后的工作,举个例子吧,比如网卡驱动,当有数据包到达网卡的时候,就会产生中断,然后一 个特定的 ...
- Linux 进程间通讯详解一
进程间的通讯 两台主机间的进程通讯 --socket一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量, ...
- Linux 进程间通讯(IPC)方式 ------- 共享内存
Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...
- Linux 进程间通讯方式 pipe()函数
Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6-&g ...
- (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】
Linux 进程 和 线程 的基本 编程.通讯 和 例程 注:[杂记]系列为日常网搜资料的堆砌而积累成之.如有错误恭谢指出.标识为"原创"其实不完全是,只是多引用再整理和加上自己的 ...
- linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道
Linux进程间通讯的方式: 1. 管道(pipe)和有名管道(FIFO). 2. 信号(signal) 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字(socket) 管道通讯: 无名管 ...
- 吉林大学操作系统上机(实验一:Linux进程与线程通讯)
前言 我希望找到这里的学弟学妹能基于我的内容完成的更好,这里的代码和思路应该是你们的下限!! 我分享这些笔记的初衷是因为我觉得csdn上与之相关的不少博客都收费,但是我当时做的时候,我觉得就那么一点东 ...
- Linux 进程和计划任务管理
文章目录 1. 前言 2. 进程 2.1 什么是进程 2.2 程序和进程的关系 2.3 进程,线程和协程 2.4 进程常用管理命令 (1) ps (2) top (3) pgrep (4) pstre ...
最新文章
- jdbcdslog hibernate sql log
- 很多人问,到底要不要转管理
- [USACO1.2]回文平方数 Palindromic Squares
- electron、node
- 关于lock_guard使用细节
- 用truffle部署智能合约到以太坊网络(truffle+infura)的简易方法
- 亚马逊EC2服务器使用Rsync+Inotify实时同步
- thymeleaf模板引擎使用iframe的解决方案
- Python语言程序设计 第七周 文件和数据格式化
- easyUI的iconCls
- 外汇兑换人民币业务的居民
- 2020电子信息夏令营(湖大,吉大,中山,武大,浙大)
- 软件测试面试智商题,程序员面试时遇智商测试题:15分钟内答对这3题,你的IQ可以碾压大多数人!...
- Android sim卡 pin码解锁流程.
- python Stark 组件
- 【精品】机器学习模型可解释的重要及必要性
- Android之——手机黑名单的实现
- 《宝岛双雄》曝正式海报 房祖名挑大梁的银幕转型之作
- 计算机一级考试题电子表格,2017计算机一级Excel模拟考试题
- Android 报错A/libc: Fatal signal 6 (SIGABRT), code -6 in tid *** 解决
热门文章
- element ui select 自动向上向下弹出_达观数据:Selenium使用技巧与机器人流程自动化实战...
- java字符串拼接_Java 8中字符串拼接新姿势:StringJoiner
- 上海黑马JAVA30期_2018年4月最新黑马Javaee第297期
- Java中的SPI(Service Provider Interface介绍及示例
- Python编程基础05:运算符与表达式
- Java讲课笔记11:构造方法与this关键字
- Java讲课笔记07:计数循环与嵌套循环
- 【BZOJ4600】硬币游戏,博弈
- php 热点图,JavaScript_javascript如何写热点图,在gis中,你如果用js来写热点 - phpStudy...
- java 抽象类的匿名类_Java匿名内部类(通过继承抽象类来实现)