当前位置:网站首页>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 执行结果

边栏推荐
猜你喜欢
随机推荐
【C语言】结构体变量数据通过 void* 传入到函数中
LabVIEW中如何实现任意形状的不规则按键
#Sealos#使用工具部署kubernetesV1.24.0
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
1, Citrix XenDesktop 2203 AD domain system installation (1)
In-depth analysis if according to data authority @datascope (annotation + AOP + dynamic sql splicing) [step by step, with analysis process]
淘宝客APP带自营商城本地生活CPS外卖优惠电影票话费更新渠道跟单生活特权V3
2022起重机司机(限桥式起重机)考试题库及模拟考试
typescript66-分析partial的实现
共享内存+inotify机制实现多进程低延迟数据共享
Email management Filter emails
MySQL:基础部分
UDP广播
在小程序中关于js数字精度丢失的解决办法
typescript62-泛型工具类型(record)
2022杭电多校六 1007-Shinobu loves trip(同余方程)
Nacos cluster construction
Mysql主从延迟的原因和解决方案
【工具配置篇】VSCode 常用使用总结
scikit-image image processing notes








