IPC(Inter-Process Communication,进程间通信)
系统对文件本身存在缓存机制,使用文件进行IPC的效率在某些多读少写的情况下并不低下
1.竞争条件(racing)
并发100个进程,约定好一个内容初值为0的文件,每一个进程打开文件读出数字,并且加一写回:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>//提供write(),read(),lseek()函数及相关参数定义
#include <errno.h>
#include <fcntl.h>//提供open()函数及相关参数定义
#include <string.h>
#include <sys/file.h>
#include <wait.h>
#define COUNT 100
#define NUM 64
#define FILEPATH "./count"//文件的路径
int do_child(const char *path)//子进程执行函数
{
int fd,ret,count;
char buf[NUM];
fd = open(path,O_RDWR); //成功返回0值,不成功返回-1,可读可写的方式打开path路径的文件
if (fd<0)//若打开失败,打印返回的错误
{
perror("open()");
exit(1);//异常退出
}
ret=read(fd,buf,NUM);//成功返回读取字节数,错误返回-1
if(ret<0)
{
perror("read()");
exit(1);
}
buf[ret] = "\0";
count=atoi(buf);//字符串转换成整型数,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数
++count;
sprintf(buf,"%d",count);//将整型变量count打印成字符串输出到buf中
lseek(fd,0,SEEK_SET);//将读写位置移到文件开头
ret= write(fd,buf,strlen(buf));//将buf写进文件中
close(fd);
exit(0);//正常退出
}
int main()
{
pid_t pid;//pid_t实际上就是int,在/sys/types.h中定义
int count;
for(count=0;count<COUNT;count++)
{
pid=fork();//创建一个子进程进程,在父进程中,fork返回新创建子进程的进程ID;在子进程中,fork返回0;如果出现错误,fork返回一个负值;
if(pid<0)
{
perror("fork()");
exit(1);
}
if(pid==0)
{
do_child(FILEPATH);//创建出来的那个新进程执行任务
}
}
for(count=0;count<COUNT;count++)
wait(NULL);//等待所有进程退出
}
运行情况:
zach@zach-i16:<