1.1.要求实现AB进程对话
A进程先发送一句话给B进程,B进程接收后打印
B进程再回复一句话给A进程,A进程接收后打印
重复1.2步骤,当收到quit后,要结束AB进程
提示:两根管道
A进程代码
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<pthread.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
void *callback_wirte(void *arg)
{
int fd=*(int*)arg;
char buf[128]="";
while(1)
{
//写
printf("请输入发送内容>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
if(write(fd,buf,sizeof(buf))<0)
{
perror("write");
return NULL;
}
if(strcasecmp(buf,"quit")==0)
break;
printf("写入成功\n");
}
pthread_exit(NULL);
}
void *callback_read(void *arg)
{
int fd2=*(int*)arg;
char buf2[128]="";
while(1)
{
//读
bzero(buf2,sizeof(buf2));
size_t res=read(fd2,buf2,sizeof(buf2));
if(res<0)
{
perror("read");
return NULL;
}
else if(0==res)
{
printf("写端退出\n");
break;
}
printf("\n对方发送:");
printf("%s\n",buf2);
if(strcasecmp(buf2,"quit")==0)
{
printf("A线程read已退出\n");
exit(0);
}
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
umask(0);
//创建有名管道
if(mkfifo("./fifo",0664)<0)
{
if(17!=errno)
{
perror("mkfifo");
return -1;
}
}
if(mkfifo("./fifo2",0664)<0)
{
if(17!=errno)
{
perror("mkfifo");
return -1;
}
}
//打开第一个管道文件
int fd=open("./fifo",O_WRONLY);
if(fd<0)
{
perror("open");
return -1;
}
printf("第一个管道打开成功!\n");
//打开第二个管道文件
int fd2=open("./fifo2",O_RDONLY);
if(fd2<0)
{
perror("open");
return -1;
}
printf("第二个管道文件打开成功\n");
//创建线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,callback_wirte,&fd)!=0)
{
fprintf(stderr,"pthread tid1 create success!\n");
return -1;
}
if(pthread_create(&tid2,NULL,callback_read,&fd2)!=0)
{
fprintf(stderr,"pthread tid1 create success!\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
close(fd);
close(fd2);
return 0;
}
b进程代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<pthread.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
void *callback_wirte(void *arg)
{
int fd=*(int*)arg;
char buf[128]="";
while(1)
{
//写
printf("请输入发送内容>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
if(write(fd,buf,sizeof(buf))<0)
{
perror("write");
return NULL;
}
if(strcasecmp(buf,"quit")==0)
break;
printf("写入成功\n");
}
pthread_exit(NULL);
}
void *callback_read(void *arg)
{
int fd2=*(int*)arg;
char buf[128]="";
while(1)
{
//读
bzero(buf,sizeof(buf));
size_t res=read(fd2,buf,sizeof(buf));
if(res<0)
{
perror("read");
return NULL;
}
else if(0==res)
{
printf("写端退出\n");
pthread_exit(NULL);
}
printf("\n对方发送:");
printf("%s\n",buf);
if(strcasecmp(buf,"quit")==0)
{
printf("B线程read已退出\n");
// break;
exit(0);
}
}
}
int main(int argc, const char *argv[])
{
umask(0);
//创建有名管道
if(mkfifo("./fifo",0664)<0)
{
if(17!=errno)
{
perror("mkfifo");
return -1;
}
}
if(mkfifo("./fifo2",0664)<0)
{
if(17!=errno)
{
perror("mkfifo");
return -1;
}
}
//打开第一个管道文件
int fd=open("./fifo",O_RDONLY);
if(fd<0)
{
perror("open");
return -1;
}
printf("第一个管道打开成功!\n");
//打开第二个管道文件
int fd2=open("./fifo2",O_WRONLY);
if(fd2<0)
{
perror("open");
return -1;
}
printf("第二个管道文件打开成功\n");
//创建线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,callback_read,&fd)!=0)
{
fprintf(stderr,"pthread tid1 create success!\n");
return -1;
}
if(pthread_create(&tid2,NULL,callback_wirte,&fd2)!=0)
{
fprintf(stderr,"pthread tid1 create success!\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
close(fd);
close(fd2);
return 0;
}
2.捕获2 3 20号信号
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void handler(int sig)
{
printf("触发sig=%d信号\n",sig);
}
int main(int argc, const char *argv[])
{
//捕获2) SIGINT,注册新的处理函数
__sighandler_t s=signal(2,handler);
if(SIG_ERR == s)
{
perror("singnal");
return -1;
}
//捕获3)
__sighandler_t s3=signal(3,handler);
if(SIG_ERR == s3)
{
perror("singnal");
return -1;
}
//捕获20)
__sighandler_t s20=signal(20,handler);
if(SIG_ERR == s20)
{
perror("singnal");
return -1;
}
while(1)
{
printf("singnal....\n");
sleep(1);
}
return 0;
}