資源簡介
兩個(gè)獨(dú)立的程序 master 和 client,要求這兩個(gè)程序完成以下功能:
(1) master 和 client 分別創(chuàng)建一個(gè)子進(jìn)程;
(2) client 完成創(chuàng)建子進(jìn)程后,其子進(jìn)程等待用戶從鍵盤輸入一串字符串,并將字符串通
過 clinet 發(fā)送到 master;
(3) master 完成創(chuàng)建子進(jìn)程后,等待接收 client 發(fā)送的字符串,接收完成后,將接收的
字符串發(fā)送給其子進(jìn)程,子進(jìn)程接收字符串后,打印出接受到的字符串內(nèi)容,同時(shí)通過 master
向 client 發(fā)送接收成功響應(yīng);
(4) client 發(fā)送字符串后,等待 master 響應(yīng),并打印通知用戶通信成功;
(5) 設(shè)定一個(gè)終止條件,當(dāng)終止條件被觸發(fā)時(shí),將兩個(gè)程序退出。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?READ?0
#define?WRITE?1
#define?FIFO1?“/root/Desktop/FIFO1“?/*有名管道的名字*/
#define?FIFO2?“/root/Desktop/FIFO2“
#define?LENGTH?50?/*字符數(shù)組的長度*/
int?main()
{
pid_t?pid;
int?retfd1fd2;?/*ret用來接收mkfifo返回的值,fd用來存放打開有名管道的文件描述符*/
char?buf[LENGTH];
int?filedis[2];
pipe(filedis);
if(access(FIFO1F_OK))//判斷是否已經(jīng)創(chuàng)建了有名管道,如果已經(jīng)創(chuàng)建,則返回0否則返回非0的數(shù)??????????????????????
????{
????????ret?=?mkfifo(FIFO10777);?/*創(chuàng)建有名管道成功返回0失敗返回-1*/
????????if(ret?==?-1)?/*創(chuàng)建有名管道失敗*/
????????{
????????????printf(“error?mkfifo“);
????????????exit(1);
????????}
????}
????if(access(FIFO2F_OK))//判斷是否已經(jīng)創(chuàng)建了有名管道,如果已經(jīng)創(chuàng)建,則返回0否則返回非0的數(shù)??????????????????????
????{
????????ret?=?mkfifo(FIFO20777);?/*創(chuàng)建有名管道成功返回0失敗返回-1*/
????????if(ret?==?-1)?/*創(chuàng)建有名管道失敗*/
????????{
????????????printf(“error?mkfifo“);
????????????exit(1);
????????}
????}
if((pid=fork())==?-1) //創(chuàng)建無名管道失敗
{
printf(“error?fork“);
return?0;
}
if(pid==0) //child
{
fgets(bufLENGTHstdin); //等待用戶輸入字符串
close(filedis[READ]);
//printf(“test1:%s\n“buf);
write(filedis[WRITE]bufstrlen(buf)); //發(fā)送給父進(jìn)程
}
else //parent
{
close(filedis[WRITE]);
int?len=0;
while(1) //等待接收子進(jìn)程發(fā)來的數(shù)據(jù)
{
len=read(filedis[READ]bufsizeof(buf));
if(len>0)?break;
}
//printf(“test2:%s\n“buf);
fd1?=?open(FIFO1O_WRONLY);?//寫方式打開有名管道,不能同時(shí)以讀寫權(quán)限打開成功返回文件描述符,失敗返回-1
if(fd1??==?-1)?/*打開失敗*/
{
printf(“error:?open?fifo“);
exit(1);
}
write(fd1bufstrlen(buf)); //將數(shù)據(jù)通過有名管道發(fā)送到maseter
close(fd1);
fd2?=?open(FIFO2O_RDONLY);
memset(buf‘\0‘sizeof(buf)); //清空buf
len=0;
while(1)
{
len=read(fd2buf2);
if(len>0&&buf[0]==‘O‘&&buf[1]==‘K‘)?
{
printf(“%s“buf);
printf(“communication?success!\nthis?is?client‘s?parentid:%d\n“getpid());
break;
}
}
/* memset(buf‘\0‘sizeof(buf)); //清空buf?等待接收結(jié)束命令
len=0;
while(1)
{
len=read(fd2buf1);
if(len>0&&buf[0]==‘q‘)?
{
close(fd2);
break;
}
}*/
printf(“end\n“);?
}
return?0;
}
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????2367??2019-01-07?18:42??master.c
?????文件????????2595??2019-01-07?18:39??client.c
評論
共有 條評論