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

边栏推荐
猜你喜欢
随机推荐
文本样式这一篇文章就够了
字体样式及其分类
LaTeX Notes
【Go】IM系统Centrifugo
2022起重机司机(限桥式起重机)考试题库及模拟考试
typescript61-泛型工具类型(pick)
蓝牙gap协议
长度以及颜色单位基本概念
(2022杭电多校六)1010-Planar graph(最小生成树)
Promise (三) async/await
在小程序中关于js数字精度丢失的解决办法
【网友真实投稿】为女友放弃国企舒适圈,转行软件测试12k*13薪
NACOS Configuration Center Settings Profile
【C语言】结构体变量数据通过 void* 传入到函数中
七夕!专属于程序员的浪漫表白
Week 8 Document Clustering(文本聚类)
Using printf function in STM32
基于快速行进平方法的水面无人船路径规划
《PyTorch深度学习实践》第十一课(卷积神经网络CNN高级版)
Hong Kong International Jewellery Show and Hong Kong International Diamond, Gem and Pearl Show kick off









