linux進(jìn)程通訊之純文本文件講解
一)概述:
1)純文本文件是一種原始但卻高效的進(jìn)程間通信方式,當(dāng)兩個不同步執(zhí)行的進(jìn)程必須要進(jìn)行通信時,文件或許是進(jìn)行IPC的唯一選擇.
2)一般來講通過純文本文件在多個進(jìn)程之間進(jìn)行過渡,傳輸數(shù)據(jù),而gcc編譯程序就是一個例子,它會生成中間文件,最后再將其刪除.
3)當(dāng)兩個進(jìn)程使用文件進(jìn)行通信時,無法保證當(dāng)一個進(jìn)程在讀的時候,另一個進(jìn)程沒有去寫,下面的例子用于說明這個問題.
二)文本文件的IPC和lockf函數(shù)
源程序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: %sn", 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=%dn", WEXITSTATUS(status));
unlink(filename);
}
exit(0);
}
gcc file-ipc-naive.c -o file-ipc-naive
當(dāng)運行時返回下面的錯誤信息
./file-ipc-naive
child:fopen: No such file or directory
child status=1
我們來分析一下上面的程序,程序運行后即執(zhí)行了fork,此時派生了子進(jìn)程,執(zhí)行了child();而父進(jìn)程執(zhí)行了parent();
子進(jìn)程通過fopen(filename, "r")試圖打開messagebuf.dat文件,而此時如果父進(jìn)程沒有執(zhí)行到fopen(filename, "w"),這時程序就會報上面的錯誤.
而如果我們通過strace運行file-ipc-navie這個程序,返回的結(jié)果也許會不同,如下:
strace -o strace.out -f ./file-ipc-naive
child read: Hello world;
child status=0
原因在于用strace監(jiān)視程序運行時,有充足的時間讓程序可以輸出正確的結(jié)果,但不是每次都能得到正確的輸出.
為解決這個問題,我們可以用lockf函數(shù)對文件進(jìn)行鎖定控制.
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解