题目
1)要求AB进程做通信
-
A进程发送一句话,B进程接收打印
-
然后B进程发送给A进程一句话,A进程接收打印
-
重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
代码
进程A代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#define PER(per) {fprintf(stderr,"line: %d ",__LINE__);\
perror(per);\
exit(0);}
int main(int argc, const char *argv[])
{
//清空umask
umask(0);
//创建有名管道1
if(mkfifo("fifo1",0755)==-1)
{
if(errno!=17)
{
PER("mkfifo1")
}
}
printf("mkfifo1 success\n");
//创建有名管道2
if(mkfifo("fifo2",0755)==-1)
{
if(errno!=17)
{
PER("mkfifo2")
}
}
printf("mkfifo2 success\n");
//以写的方式打开管道1
int fd1=open("fifo1",O_WRONLY);
if(fd1==-1)
{
PER("open")
}
printf("open fifo1_WR success\n");
//以读的方式打开管道2
int fd2=open("fifo2",O_RDONLY);
if(fd2==-1)
{
PER("open")
}
printf("open fifo2_RD success\n");
char w[128]="";
char r[128]="";
ssize_t res=0;
while(1)
{
bzero(w,sizeof(w));
bzero(r,sizeof(r));
//发送
printf("请输入-->>");
fgets(w,sizeof(w),stdin);
w[strlen(w)-1]=0;
if(strcasecmp(w,"quit")==0)
{
printf("退出通讯中\n");
}
if(write(fd1,w,sizeof(w))==-1)
{
PER("write")
}
//接收
res=read(fd2,r,sizeof(r));
if(res==-1)
{
PER("read")
}
else if(res==0)
{
if(strcasecmp(w,"quit")==0)
{
printf("成功退出通讯\n");
}
else
{
printf("对方程序退出\n");
}
break;
}
if(strcasecmp(r,"quit")==0)
{
printf("退出通讯\n");
exit(0);
}
printf("read B数据成功,为%ld,%s\n",res,r);
}
close(fd1);
close(fd2);
return 0;
}
进程B代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#define PER(per) {fprintf(stderr,"line: %d ",__LINE__);\
perror(per);\
exit(0);}
int main(int argc, const char *argv[])
{
//清空umask
umask(0);
//创建有名管道1
if(mkfifo("fifo1",0755)==-1)
{
if(errno!=17)
{
PER("mkfifo1")
}
}
printf("mkfifo1 success\n");
//创建有名管道2
if(mkfifo("fifo2",0755)==-1)
{
if(errno!=17)
{
PER("mkfifo2")
}
}
printf("mkfifo2 success\n");
//以读的方式打开管道1
int fd1=open("fifo1",O_RDONLY);
if(fd1==-1)
{
perror("open");
return -1;
}
printf("open fifo1_RD success\n");
//以写的方式打开管道2
int fd2=open("fifo2",O_WRONLY);
if(fd2==-1)
{
perror("open");
return -1;
}
printf("open fifo2_WR success\n");
//读管道
char r[128]="";
char w[128]="";
ssize_t res=0;
while(1)
{
bzero(r,sizeof(r));
res=read(fd1,r,sizeof(r));
if(res==-1)
{
PER("read")
}
else if(res==0)
{
if(strcasecmp(w,"quit")==0)
{
printf("成功退出通讯\n");
}
else
{
printf("对方程序退出\n");
}
break;
}
if(strcasecmp(r,"quit")==0)
{
printf("退出通讯\n");
exit(0);
}
printf("read A数据成功,为%ld ,%s\n",res,r);
bzero(w,sizeof(w));
printf("请输入-->>");
fgets(w,sizeof(w),stdin);
w[strlen(w)-1]=0;
if(strcasecmp(w,"quit")==0)
{
printf("退出通讯中\n");
}
if(write(fd2,w,sizeof(w))==-1)
{
PER("write")
}
}
close(fd1);
close(fd2);
return 0;
}
2)捕获2)3)20)号信号
//捕获信号2代码可用,为了调试方便,注释了此代码
代码
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
typedef void (*sighandler_t)(int);
//信号2
void handler2(int sig)
{
printf("this is 信号%d\n",sig);
}
//信号3
void handler3(int sig)
{
printf("this is 信号%d\n",sig);
}
//信号20
void handler20(int sig)
{
printf("this is 信号%d\n",sig);
}
int main(int argc, const char *argv[])
{
//捕获信号2代码可用,为了调试方便,注释了此代码
/*
//捕获信号2
sighandler_t s2=signal(2,handler2);
if(s2==SIG_ERR)
{
perror("signal");
return -1;
}
*/
//捕获信号3
sighandler_t s3=signal(3,handler3);
if(s3==SIG_ERR)
{
perror("signal");
return -1;
}
//捕获信号20
sighandler_t s20=signal(20,handler20);
if(s20==SIG_ERR)
{
perror("signal");
return -1;
}
while(1)
{
printf("this is main\n");
sleep(1);
}
return 0;
}