• 大小: 2KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2022-10-06
  • 语言: 其他
  • 标签: 匿名管道  FIFO  

资源简介

两个独立的程序 master 和 client,要求这两个程序完成以下功能: (1) master 和 client 分别创建一个子进程; (2) client 完成创建子进程后,其子进程等待用户从键盘输入一串字符串,并将字符串通 过 clinet 发送到 master; (3) master 完成创建子进程后,等待接收 client 发送的字符串,接收完成后,将接收的 字符串发送给其子进程,子进程接收字符串后,打印出接受到的字符串内容,同时通过 master 向 client 发送接收成功响应; (4) client 发送字符串后,等待 master 响应,并打印通知用户通信成功; (5) 设定一个终止条件,当终止条件被触发时,将两个程序退出。

资源截图

代码片段和文件信息

#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 /*字符数组的长度*/

int main()
{
pid_t pid;
int retfd1fd2; /*ret用来接收mkfifo返回的值,fd用来存放打开有名管道的文件描述符*/
char buf[LENGTH];
int filedis[2];
pipe(filedis);

if(access(FIFO1F_OK))//判断是否已经创建了有名管道,如果已经创建,则返回0否则返回非0的数                      
    {
        ret = mkfifo(FIFO10777); /*创建有名管道成功返回0失败返回-1*/
        if(ret == -1) /*创建有名管道失败*/
        {
            printf(“error mkfifo“);
            exit(1);
        }
    }
    if(access(FIFO2F_OK))//判断是否已经创建了有名管道,如果已经创建,则返回0否则返回非0的数                      
    {
        ret = mkfifo(FIFO20777); /*创建有名管道成功返回0失败返回-1*/
        if(ret == -1) /*创建有名管道失败*/
        {
            printf(“error mkfifo“);
            exit(1);
        }
    }

if((pid=fork())== -1) //创建无名管道失败
{
printf(“error fork“);
return 0;
}

if(pid==0) //child
{
fgets(bufLENGTHstdin); //等待用户输入字符串
close(filedis[READ]);
//printf(“test1:%s\n“buf);
write(filedis[WRITE]bufstrlen(buf)); //发送给父进程
}
else //parent
{
close(filedis[WRITE]);
int len=0;
while(1) //等待接收子进程发来的数据
{
len=read(filedis[READ]bufsizeof(buf));
if(len>0) break;
}
//printf(“test2:%s\n“buf);

fd1 = open(FIFO1O_WRONLY); //写方式打开有名管道,不能同时以读写权限打开成功返回文件描述符,失败返回-1
if(fd1  == -1) /*打开失败*/
{
printf(“error: open fifo“);
exit(1);
}
write(fd1bufstrlen(buf)); //将数据通过有名管道发送到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 等待接收结束命令
len=0;
while(1)
{
len=read(fd2buf1);
if(len>0&&buf[0]==‘q‘) 
{
close(fd2);
break;
}
}*/
printf(“end\n“); 
}
return 0;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2367  2019-01-07 18:42  master.c
     文件        2595  2019-01-07 18:39  client.c

评论

共有 条评论