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

边栏推荐
- iMedicalLIS listener (2)
- What is the function of industrial-grade remote wireless transmission device?
- 【8.2】代码源 - 【货币系统】【硬币】【新年的问题(数据加强版)】【三段式】
- UE4 第一人称角色模板 添加冲刺(加速)功能
- UE4 通过与其它Actor互动开门
- Mysql的undo log详解
- UE4 opens doors with overlapping events
- Some conventional routines of program development (1)
- [Surveying] Quick Summary - Excerpt from Gaoshu Gang
- Mini Program_Dynamic setting of tabBar theme skin
猜你喜欢
![Spark Basics [Introduction, Getting Started with WordCount Cases]](/img/90/ebe887db0f8c36895691dea05f62cf.png)
Spark Basics [Introduction, Getting Started with WordCount Cases]

日志导致线程Block的这些坑,你不得不防

Index Mysql in order to optimize paper 02 】 【 10 kinds of circumstances and the principle of failure
![[MRCTF2020]Ezpop(详解)](/img/19/920877ca36d1eda8d118637388ab05.png)
[MRCTF2020]Ezpop(详解)

Mysql的redo log详解
How to identify false evidence and evidence?

JeeSite新建报表

概率论的学习和整理8: 几何分布和超几何分布

JeeSite New Report

UE4 通过与其它Actor互动开门
随机推荐
【8.3】代码源 - 【喵 ~ 喵 ~ 喵~】【树】【与】
国学*周易*梅花易数 代码实现效果展示 - 梅花心易
日志导致线程Block的这些坑,你不得不防
markdown如何换行——md文件
阿里本地生活单季营收106亿,大文娱营收72亿,菜鸟营收121亿
虚证、实证如何鉴别?
App快速开发建设心得:小程序+自定义插件的重要性
小程序_动态设置tabBar主题皮肤
dedecms后台生成提示读取频道信息失败的解决方法
C++ core programming
不看后悔,appium自动化环境完美搭建
MySql index learning and use; (I think it is detailed enough)
dedecms报错The each() function is deprecated
A 35-year-old software testing engineer with a monthly salary of less than 2W, resigns and is afraid of not finding a job, what should he do?
多御安全浏览器新版下载 | 功能优秀性能出众
SkiaSharp 之 WPF 自绘 粒子花园(案例版)
[MRCTF2020] PYWebsite
The test salary is so high?20K just graduated
[Surveying] Quick Summary - Excerpt from Gaoshu Gang
[SWPU2019]Web1