当前位置:网站首页>Homework 8.4 Interprocess Communication Pipes and Signals
Homework 8.4 Interprocess Communication Pipes and Signals
2022-08-05 04:20:00 【Unknown college student M】
题目一:要求ABprocess to communicate
1.AThe process sends a sentence,BThe process receives the print
2.然后B进程发送给AProcess in a word,AThe process receives the print
3.重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
实现代码
进程A
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
umask(0);
//创建有名管道1
if(mkfifo( "./myfifo1",0777) < 0)
{
//printf( "errno = %d\n",errno);
if(errno != 17)
{
//如果errno==17Indicates that the pipeline file already exists,is a legitimate error not handled
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo1 success\n" );
//创建有名管道2
if(mkfifo( "./myfifo2",0777) < 0)
{
//printf( "errno = %d\n",errno);
if(errno != 17)
{
//如果errno==17Indicates that the pipeline file already exists,is a legitimate error not handled
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo2 success\n" );
//Open the named pipe file for write only1
int fd1 = open( "./myfifo1",O_WRONLY);
if(fd1 < 0)
{
perror( "open" );
return -1;
}
//Open the named pipe file as read-only2
int fd2 = open( "./myfifo2",O_RDONLY);
if(fd2 < 0)
{
perror( "open" );
return -1;
}
printf( "open readonly success\n");
char buf1[128]="";
char buf2[128]="";
ssize_t res=0;
while(1)
{
bzero(buf1,sizeof(buf1));
printf("请输入>>>");
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1]=0;
if(write(fd1,buf1,sizeof(buf1))<0)
{
perror("write");
return -1;
}
if(strcasecmp(buf1, "quit") == 0)
break;
printf("write success\n");
bzero(buf2,sizeof(buf2));
res=read(fd2,buf2,sizeof(buf2));
if(strcasecmp(buf2, "quit") == 0)
break;
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
printf("The other process exits\n");
break;
}
printf("read success:%s\n",buf2);
}
//关闭文件描述符
close(fd1);
close(fd2);
return 0;
}
进程B
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
umask(0);
//创建有名管道1
if(mkfifo( "./myfifo1",0777) < 0)
{
//printf( "errno = %d\n",errno);
if(errno != 17)
{
//如果errno==17Indicates that the pipeline file already exists,is a legitimate error not handled
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo1 success\n" );
//创建有名管道2
if(mkfifo( "./myfifo2",0777) < 0)
{
//printf( "errno = %d\n",errno);
if(errno != 17)
{
//如果errno==17Indicates that the pipeline file already exists,is a legitimate error not handled
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo2 success\n" );
//Open the named pipe file as read-only1
int fd1 = open( "./myfifo1",O_RDONLY);
if(fd1 < 0)
{
perror( "open" );
return -1;
}
//Open the named pipe file for write only2
int fd2 = open( "./myfifo2",O_WRONLY);
if(fd2 < 0)
{
perror( "open" );
return -1;
}
printf( "open readonly success\n");
char buf1[128]="";
char buf2[128]="";
ssize_t res=0;
while(1)
{
bzero(buf1,sizeof(buf1));
res=read(fd1,buf1,sizeof(buf1));
if(strcasecmp(buf1, "quit") == 0)
break;
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
printf("The other process exits\n");
break;
}
printf("read success:%s\n",buf1);
bzero(buf2,sizeof(buf2));
printf("请输入>>>");
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1]=0;
if(write(fd2,buf2,sizeof(buf2))<0)
{
perror("write");
return -1;
}
if(strcasecmp(buf2, "quit") == 0)
break;
printf("write success\n");
}
//关闭文件描述符
close(fd1);
close(fd2);
return 0;
}
运行结果

题目二:捕获2)3)20)号信号
实现代码
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
typedef void (*sighandler_t)(int);
//New handler function
void handler_1(int sig)
{
printf("this is handler_1 \n");
printf("成功捕获%d号信号\n", sig);
}
void handler_2(int sig)
{
printf("this is handler_2\n");
printf("成功捕获%d号信号\n", sig);
}
void handler_3(int sig)
{
printf("this is handler_3 \n");
printf("成功捕获%d号信号\n", sig);
}
int main(int argc, const char *argv[])
{
//捕获2号信号SIGINT
sighandler_t s = signal(2, handler_1);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
//捕获3号信号SIGINT
s = signal(3, handler_2);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
//捕获20号信号SIGINT
s = signal(20, handler_3);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
while(1)
{
printf("this is main\n");
sleep(1);
}
return 0;
}
运行结果

边栏推荐
- 第一次性能测试实践,有“亿”点点紧张
- 多御安全浏览器新版下载 | 功能优秀性能出众
- DEJA_VU3D - Cesium功能集 之 058-高德地图纠偏
- What is ASEMI photovoltaic diode, the role of photovoltaic diode
- [CISCN2019 华东南赛区]Web11
- [8.1] Code Source - [The Second Largest Number Sum] [Stone Game III] [Balanced Binary Tree]
- 动力小帆船制作方法简单,电动小帆船制作方法
- 程序开发的一些常规套路(一)
- Android interview question - how to write with his hands a non-blocking thread safe queue ConcurrentLinkedQueue?
- Day14 jenkins部署
猜你喜欢

What is ASEMI photovoltaic diode, the role of photovoltaic diode

35岁的软件测试工程师,月薪不足2W,辞职又怕找不到工作,该何去何从?

how to measure distance from point to face in creo
![[CISCN2019 华东南赛区]Web11](/img/15/843334fec0a5cc8cfaba92aab938db.png)
[CISCN2019 华东南赛区]Web11

Feature preprocessing

bytebuffer internal structure

The production method of the powered small sailboat is simple, the production method of the electric small sailboat

The log causes these pits in the thread block, you have to guard against

UI自动化测试 App的WebView页面中,当搜索栏无搜索按钮时处理方法

商业智能BI业务分析思维:现金流量风控分析(一)营运资金风险
随机推荐
The most comprehensive exam questions for software testing engineers in 2022
银行数据采集,数据补录与指标管理3大问题如何解决?
Spark Basics [Introduction, Getting Started with WordCount Cases]
Cron(Crontab)--使用/教程/实例
Four-digit display header design
NPDP证书含金量高吗?跟PMP相比?
SkiaSharp 之 WPF 自绘 粒子花园(案例版)
[CISCN2019 华东南赛区]Web11
Machine Learning Overview
DEJA_VU3D - Cesium功能集 之 057-百度地图纠偏
什么是ASEMI光伏二极管,光伏二极管的作用
1007 Climb Stairs (贪心 | C思维)
bytebuffer use demo
iMedicalLIS listener (2)
[8.3] Code Source - [meow ~ meow ~ meow~] [tree] [and]
How do newcomers get started and learn software testing?
[SWPU2019]Web1
作业8.4 进程间的通信 管道与信号
write the story about us
upload上传图片到腾讯云,如何上传图片