进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
2. 有名管道首先创建两个文件作为两个进程,分别取名为mk_fifoa和mk_fifob(注意,进程名不可与管道名相同)。
两个有名管道文件在一个文件内创建完即可。
利用mkfifo函数创建两个有名管道文件
int mkfifo(const char *pathname, mode_t mode);
//创建有名管道文件fifoa
int ret = -1;
ret = mkfifo("fifoa",0666);
//创建文件失败并且该文件不存在,若文件存在则正常执行
if(-1 == ret && errno != EEXIST)
{perror("mkfifoa error\r\n");
return -1;
}
printf("create fifoa OK!\r\n");
//创建有名管道文件fifob
ret = mkfifo("fifob",0666);
if(-1 == ret && errno != EEXIST)
{perror("mkfifob error\r\n");
return -1;
}
printf("create fifob OK!\r\n");
4. 进程通信
4.1 进程mk_fifoa
4.1.1 打开两个有名管道文件并循环写入数据利用IO所学的知识,使用文件IO打开
头文件:
#include#include#include#include
进程mk_fifoa先向管道文件fifoa内写入数据,然后由mk_fifob进程读出。完成进程mk_fifoa向进程mk_fifob通信
//打开文件fifoa,先把数据写入到fifoa中
int fdw = open("fifoa",O_WRONLY,0666);
if(-1 == fdw)
{perror("open errer\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob,读取从进程mk_fifob中写入的数据
int fdr = open("fifob",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifob OK!\r\n");
//定义一个数组存放数据
char buf[BUF_SIZE] = {0};
//循环通信
while(1)
{//先写入
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
//读出
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("b ->a: %s",buf);
}
//关闭文件
close(fdw);
close(fdr);
4.2 进程mk_fifob
4.2.1 打开两个有名管道文件并循环写入数据进程mk_fifob刚好与进程mk_fifoa相反先读出在写入
进程mk_fifob再向管道文件fifob内写入数据,然后由mk_fifoa进程读出。完成进程mk_fifob向进程mk_fifoa通信。
//打开文件fifoa
int fdr = open("fifoa",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob
int fdw = open("fifob",O_WRONLY,0666);
if(-1 == fdw)
{perror("open error");
return -1;
}
printf("open fifob OK!\r\n");
char buf[BUF_SIZE] = {0};
while(1)
{//先读
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("a ->b: %s",buf);
//写
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
}
close(fdr);
close(fdw);
5. 运行结果完成通信
#include#include#include#include#include#include#include#define BUF_SIZE 20
int main()
{//创建有名管道文件1
int ret = -1;
ret = mkfifo("fifoa",0666);
if(-1 == ret && errno != EEXIST)
{perror("mkfifoa error\r\n");
return -1;
}
printf("create fifoa OK!\r\n");
//创建有名管道文件2
ret = mkfifo("fifob",0666);
if(-1 == ret && errno != EEXIST)
{perror("mkfifob error\r\n");
return -1;
}
printf("create fifob OK!\r\n");
//打开文件fifoa
int fdw = open("fifoa",O_WRONLY,0666);
if(-1 == fdw)
{perror("open errer\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob
int fdr = open("fifob",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifob OK!\r\n");
char buf[BUF_SIZE] = {0};
while(1)
{//先写入
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
//再读出
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("b ->a: %s",buf);
}
//关闭文件
close(fdw);
close(fdr);
return 0;
}
6.2 进程mk_fifob#include#include#include#include#include#include#include#define BUF_SIZE 20
int main()
{//打开文件fifoa
int fdr = open("fifoa",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob
int fdw = open("fifob",O_WRONLY,0666);
if(-1 == fdw)
{perror("open error");
return -1;
}
printf("open fifob OK!\r\n");
char buf[BUF_SIZE] = {0};
while(1)
{//先读
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("a ->b: %s",buf);
//写
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
}
close(fdr);
close(fdw);
}
本片文章就此结束了,目前进程学习还在进行中,只是把比较有意思的写出来分享一下,如有错误还请指正!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧