当前位置:网站首页>IO process thread -> communication between processes -> day7
IO process thread -> communication between processes -> day7
2022-08-05 07:03:00 【Whale calls me to take care of the sea QAQ】
目录
练习
1)要求AB进程做通信
1. A进程发送一句话,B进程接收打印
2. 然后B进程发送给A进程一句话,A进程接收打印
3. 重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
2)Implemented on the basis of the first question,ABProcesses can send and receive data at any time(附加题)(个人能力有限,Hope some great god can help)
3)捕获2)3)20)号信号
一、 AB通信函数
I use famous communication,Create two well-known channels,A在通道1只能读,通道2只能写,B反过来.
完成A先发送,B打印,然后再写入,B等到A写入,然后打印,再写入,循环往复,直到输出quit,Exit all programs.
1.1 A进程函数
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
umask(0);
if(mkfifo("./mkfifo1",0777) < 0)
{
if(17 != errno)
{
perror("mkfifo");
return -1;
}
}
umask(0);
if(mkfifo("./mkfifo2",0777) < 0)
{
if(17 != errno)
{
perror("mkfifo");
return -1;
}
}
printf("创建成功\n");
int fd_w=open("./mkfifo1",O_WRONLY);
if(fd_w<0)
{
perror("open");
return -1;
}
int fd_r=open("./mkfifo2",O_RDONLY);
if(fd_r<0)
{
perror("open");
return -1;
}
printf("Open the pipe successfully\n");
char str[128]="";
ssize_t res=0;
while(1)
{
printf("A线程写入:\n");
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]='\0';
if(write(fd_w,str,sizeof(str))<0)
{
perror("write");
return -1;
}
if(strcasecmp(str,"quit") == 0)
{
break;
}
printf("线程A写入成功\n");
bzero(str,sizeof(str));
res=read(fd_r,str,sizeof(str));
if(res<0)
{
perror("read");
return -1;
}else if(0 == res)
{
printf("线程B退出\n");
break;
}
if(strcasecmp(str,"quit") == 0)
{
break;
}
printf("线程B:%s\n",str);
}
close(fd_r);
close(fd_w);
printf("程序结束\n");
return 0;
}
1.2 B进程函数
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
umask(0);
if(mkfifo("./mkfifo1",0777) < 0)
{
if(17 != errno)
{
perror("mkfifo");
return -1;
}
}
umask(0);
if(mkfifo("./mkfifo2",0777) < 0)
{
if(17 != errno)
{
perror("mkfifo");
return -1;
}
}
printf("创建成功\n");
int fd_r=open("./mkfifo1",O_RDONLY);
if(fd_r<0)
{
perror("open");
return -1;
}
int fd_w=open("./mkfifo2",O_WRONLY);
if(fd_w<0)
{
perror("open");
return -1;
}
printf("Open the pipe successfully\n");
char str[128]="";
ssize_t res=0;
while(1)
{
bzero(str,sizeof(str));
res=read(fd_r,str,sizeof(str));
if(res<0)
{
perror("read");
return -1;
}else if(0 == res)
{
printf("线程A退出\n");
break;
}
if(strcasecmp(str,"quit") == 0)
{
break;
}
printf("线程A:%s\n",str);
printf("B线程写入:\n");
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]='\0';
if(write(fd_w,str,sizeof(str))<0)
{
perror("write");
return -1;
}
if(strcasecmp(str,"quit") == 0)
{
break;
}
printf("线程B写入成功\n");
}
close(fd_r);
close(fd_w);
printf("程序结束\n");
return 0;
}
1.3 执行结果

三、捕获信号
很简单,Learn about the application of the function and understand what signals are under the ID number,There is also the first capture of the signal from the default function,It is impossible to get the first address of the default function.
3.1 捕获函数
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
typedef void (*sighandler_t)(int);
void han1(int sig)
{
printf("new handler:%d\n",sig);
}
void han3(int sig)
{
printf("new handler:%d\n",sig);
}
void han20(int sig)
{
printf("new handler:%d\n",sig);
}
void handler_1(int sig)
{
printf("默认处理函数:%d\n",sig);
}
int main(int argc, const char *argv[])
{
printf("Default handler function address:%p 捕获2:%p 捕获3:%p 捕获20:%p\n",handler_1,han1,han3,han20);//Default handler function address and new handler function address
/****捕获2******/
sighandler_t s=signal(2,han1);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("[%d]: %p\n",__LINE__,s);
s=signal(2,handler_1);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("[%d]: %p\n",__LINE__,s);
/****捕获3******/
s=signal(3,han3);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("[%d]: %p\n",__LINE__,s);
s=signal(3,handler_1);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("[%d]: %p\n",__LINE__,s);
/****捕获20******/
s=signal(20,han20);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("[%d]: %p\n",__LINE__,s);
s=signal(20,handler_1);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("[%d]: %p\n",__LINE__,s);
while(1)
{
sleep(1);
}
return 0;
}
3.2 执行结果

边栏推荐
- export使用
- Promise (三) async/await
- 【动态类型检测 Objective-C】
- 盒子模型中过度约束问题及其解决办法
- In-depth analysis if according to data authority @datascope (annotation + AOP + dynamic sql splicing) [step by step, with analysis process]
- 女生做软件测试会不会成为一个趋势?
- How to avoid online memory leaks
- Hong Kong International Jewellery Show and Hong Kong International Diamond, Gem and Pearl Show kick off
- Rapid Medical超小体积且唯一可调的取栓器获得FDA核准
- typescript59-泛型工具类型(partial )
猜你喜欢
随机推荐
Technical Analysis Mode (7) Playing the Gap
MySQL表操作练习
在STM32中使用printf函数
七夕!专属于程序员的浪漫表白
Shiny04---DT和进度条在shiny中的应用
腾讯实习总结
uniapp打包次数限制怎么办?只需两步就能解决
typescript66-分析partial的实现
Kioxia and Aerospike Collaborate to Improve Database Application Performance
Day9 of Hegong Daqiong team vision team training - camera calibration
MyCat配置文件
MySQL: JDBC programming
lingo入门——河北省第三届研究生建模竞赛B题
Advanced Redis
概率与期望部分题解
DNSlog外带数据注入
LabVIEW中如何实现任意形状的不规则按键
Promise (三) async/await
小程序input框不允许输入负数
PCI Pharma Services Announces Multi-Million Dollar Expansion of UK Manufacturing Facility to Meet Growing Demand for Global High Potency Drug Manufacturing Services to Support Oncology Treatment









