当前位置:网站首页>作业8.4 进程间的通信 管道与信号
作业8.4 进程间的通信 管道与信号
2022-08-05 04:15:00 【不知名大学生M】
题目一:要求AB进程做通信
1.A进程发送一句话,B进程接收打印
2.然后B进程发送给A进程一句话,A进程接收打印
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==17代表管道文件已经存在,是合法错误不处理
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo1 success\n" );
//创建有名管道2
if(mkfifo( "./myfifo2",0777) < 0)
{
//printf( "errno = %d\n",errno);
if(errno != 17)
{
//如果errno==17代表管道文件已经存在,是合法错误不处理
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo2 success\n" );
//以只写的方式打开有名管道文件1
int fd1 = open( "./myfifo1",O_WRONLY);
if(fd1 < 0)
{
perror( "open" );
return -1;
}
//以只读的方式打开有名管道文件2
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("对方进程退出\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==17代表管道文件已经存在,是合法错误不处理
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo1 success\n" );
//创建有名管道2
if(mkfifo( "./myfifo2",0777) < 0)
{
//printf( "errno = %d\n",errno);
if(errno != 17)
{
//如果errno==17代表管道文件已经存在,是合法错误不处理
perror( "mkfifo");
return -1;
}
}
printf( "mkfifo2 success\n" );
//以只读的方式打开有名管道文件1
int fd1 = open( "./myfifo1",O_RDONLY);
if(fd1 < 0)
{
perror( "open" );
return -1;
}
//以只写的方式打开有名管道文件2
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("对方进程退出\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);
//新的处理函数
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;
}
运行结果

边栏推荐
- UE4 更改组件变量 (以修改第一人称角色模板的最大行走速度和跳跃高度为例)
- Based on holding YOLOv5 custom implementation of FacePose YOLO structure interpretation, YOLO data format conversion, YOLO process modification"
- UE4 后期处理体积 (角色受到伤害场景颜色变淡案例)
- Event parse tree Drain3 usage and explanation
- Cron(Crontab)--使用/教程/实例
- DEJA_VU3D - Cesium功能集 之 058-高德地图纠偏
- Android interview question - how to write with his hands a non-blocking thread safe queue ConcurrentLinkedQueue?
- AUTOCAD——标注关联
- App rapid development and construction experience: the importance of small programs + custom plug-ins
- 36-Jenkins-Job迁移
猜你喜欢
![[MRCTF2020] PYWebsite](/img/d4/57e8e5ee45b742894679f3f5671516.png)
[MRCTF2020] PYWebsite
![[8.1] Code Source - [The Second Largest Number Sum] [Stone Game III] [Balanced Binary Tree]](/img/f3/0d92e22a424206241f4e1640f1bf6b.png)
[8.1] Code Source - [The Second Largest Number Sum] [Stone Game III] [Balanced Binary Tree]

多列属性column元素的可见性:display、visibility、opacity、垂直对齐方式:vertical-align、z-index 越大越显示在上层
![[GYCTF2020]EasyThinking](/img/40/973411c69d1e4766d22f6a4a7c7c01.png)
[GYCTF2020]EasyThinking

什么是ASEMI光伏二极管,光伏二极管的作用

What is ASEMI photovoltaic diode, the role of photovoltaic diode

markdown如何换行——md文件

10 years of testing experience, worthless in the face of the biological age of 35

bytebuffer 使用demo

UE4 第一人称角色模板 添加生命值和调试伤害
随机推荐
小程序_动态设置tabBar主题皮肤
Is the NPDP certificate high in gold content?Compared to PMP?
iMedicalLIS listener (2)
【测量学】速成汇总——摘录高数帮
bytebuffer internal structure
What is the function of industrial-grade remote wireless transmission device?
The test salary is so high?20K just graduated
write the story about us
AUTOCAD - dimension association
为什么刚考完PMP,就开始准备软考了?
Feature preprocessing
How to identify false evidence and evidence?
36-Jenkins-Job Migration
The log causes these pits in the thread block, you have to guard against
Mini Program_Dynamic setting of tabBar theme skin
UE4 更改组件变量 (以修改第一人称角色模板的最大行走速度和跳跃高度为例)
Redis1:Redis介绍、Redis基本特性、关系型数据库、非关系型数据库、数据库发展阶段
Industry Status?Why do Internet companies prefer to spend 20k to recruit people rather than raise their salary to retain old employees~
Develop your own node package
[MRCTF2020]Ezpop(详解)