作业1->使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程接收到消息后,展示到终端上,并把消息保存到本地文件
1create.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//创建一个有名管道文件
if(mkfifo("./linux",0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
return 0;
}
1send.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以写的形式打开管道文件
int wfd=open("./linux",O_WRONLY);
if(wfd==-1)
{
perror(" open error");
return -1;
}
//发送数据
char wbuf[128]=""; //定义字符串
while(1)
{
printf("请输入要发送的消息->\n");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0;
//将数据写入管道
write(wfd,wbuf,strlen(wbuf));
//退出指令
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
//关闭文件描述符
close(wfd);
return 0;
}
1receive.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以只读的形式打开管道文件
int rfd=open("./linux",O_RDONLY);
if(rfd==-1)
{
perror("open pipe error");
return -1;
}
//以追加的形式打开文件
int afd=open("./tt.txt",O_WRONLY|O_CREAT|O_APPEND,0664);
if(afd==-1)
{
perror("open txt error");
return -1;
}
//定义接收器
char rbuf[128]="";
while(1)
{
bzero(rbuf,sizeof(rbuf));
//读取管道中的数据
read(rfd,rbuf,sizeof(rbuf));
if(strcmp(rbuf,"quit")==0) //退出条件
{
break;
}
fputs("收到消息->",stdout); //显示到终端
fputs(rbuf,stdout);
fflush(stdout);
write(afd,rbuf,strlen(rbuf)); //保存到本地文件
write(afd,"\n",1);
printf("\n");
}
close(rfd); //关闭文件描述符
close(afd);
return 0;
}
作业2->使用有名管道实现两进程之间通信
进程A
#include<myhead.h>
//定义信号函数 回收子进程而后杀死父程序
void handler(int singo)
{
if(singo==SIGUSR1)
{
wait(NULL);
raise(SIGKILL);
}
}
int main(int argc, const char *argv[])
{
//定义信号函数
if(signal(SIGUSR1,handler)==SIG_ERR)
{
perror("signal error");
return -1;
}
pid_t pid=fork(); //诞生子进程
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0)
{
//子进程
int rfd=open("./pipe2",O_RDONLY);
if(rfd==-1)
{
perror("open pipe2 error");
return -1;
}
char rbuf[128]=""; //创建接收容器
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
read(rfd,rbuf,sizeof(rbuf));
if(strcmp(rbuf,"quit")==0) //退出条件
{
break;
}
printf("收到消息:%s\n",rbuf);
}
close(rfd); //子程序先关闭通道 再发信号给父程序
kill(getppid(),SIGUSR1);
exit(EXIT_SUCCESS);
}
//父进程
int wfd=open("./pipe1",O_WRONLY);
if(wfd==-1)
{
perror("open pipe1 error");
return -1;
}
char wbuf[128]="";
while(1)
{
printf("请输入>>>\n");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0;
write(wfd,wbuf,strlen(wbuf));
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
close(wfd);
kill(pid,SIGKILL);
wait(NULL);
return 0;
}
进程B
#include<myhead.h>
//定义信号函数内容,回收子进程 杀死父进程
void handler(int signo)
{
if(signo==SIGUSR1)
{
wait(NULL);
raise(SIGKILL);
}
}
int main(int argc, const char *argv[])
{
if(signal(SIGUSR1, handler) == SIG_ERR)
{
perror("signal error");
return -1;
}
pid_t pid=fork(); //诞生子进程
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0)
{
//子进程
int wfd=open("./pipe2",O_WRONLY);
if(wfd==-1)
{
perror("open pipe2 error");
return -1;
}
char wbuf[128]=""; //创建接收容器
while(1)
{
printf("请输入>>>\n");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0;
write(wfd,wbuf,strlen(wbuf));
if(strcmp(wbuf,"quit")==0)
{
break;
}
}
close(wfd);
kill(getppid(),SIGUSR1);
exit(EXIT_SUCCESS);
}
//父进程
int rfd=open("./pipe1",O_RDONLY);
if(rfd==-1)
{
perror("open pipe1 error");
return -1;
}
char rbuf[128]="";
while(1)
{
//清空容器
bzero(rbuf,sizeof(rbuf));
read(rfd,rbuf,sizeof(rbuf));
if(strcmp(rbuf,"quit")==0) //退出条件
{
break;
}
printf("收到消息:%s\n",rbuf);
}
close(rfd);
kill(pid,SIGKILL);
wait(NULL);
return 0;
}
子进程端输入quit
父进程端输入quit