利用FIFO进行文件拷贝一例

下面的程序实现的功能是:

writefifo.c完成从打开输入的文件名,然后将内容读取到管道

readfifo.c完成将管道中读到的内容写到输入的文件名中。

 

writefifo.c :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define N 64

int main(int argc, char *argv[])
{
    int fd, pfd;
    char buf[N] = {0};
    ssize_t n;

    if (argc < 2)
    {
        printf("usage:%s srcfile\n", argv[0]);
        return 0;
    }

    if (-1 == mkfifo("fifo", 0666))  //创建管道
    {
        if (errno != EEXIST)
        {
            perror("mkfifo");
            exit(-1);
        }
    }

    if ((fd = open(argv[1], O_RDONLY)) == -1)  //打开要读的文件
    {
        perror("open srcfile");
        exit(-1);
    }

    if ((pfd = open("fifo", O_WRONLY)) == -1)  //打开管道
    {
        perror("open fifo");
        exit(-1);
    }

    while ((n = read(fd, buf, N)) > 0)   //读文件,当读到末尾时,n为0
        write(pfd, buf, n);  //将读到的内容写入管道

    close(fd);
    close(pfd);


    return 0;
}

 

 

readfifo.c

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define N 64

int main(int argc, char *argv[])
{
    int fd, pfd;
    char buf[N] = {0};
    ssize_t n;

    if (argc < 2)  //检查输入的参数是否合法
    {
        printf("usage:%s destfile\n", argv[0]);
        return 0;
    }

    if (-1 == mkfifo("fifo", 0666))   //创建一个名称为fifo的管道
    {
        if (errno != EEXIST)   //如果创建错误,看错误码是否为EEXIST,即看要创建的管道是否已经存在
        {
            perror("mkfifo");
            exit(-1);
        }
    }

    if ((fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) //打开要写的文件
    {
        perror("open destfile");
        exit(-1);
    }

    if ((pfd = open("fifo", O_RDONLY)) == -1)  //打开管道
    {
        perror("open fifo");
        exit(-1);
    }

    while ((n = read(pfd, buf, N)) > 0)  //读管道,当读到n为0时,说明写端已经关闭
        write(fd, buf, n);  //将读到的内容写到文件中

    close(fd);  //关闭要写的文件
    close(pfd);  //关闭管道


    return 0;
}

 

 

 

要设计一个SRAM-based FIFO,需要以下步骤: 1. 确定FIFO的深度和数据宽度,这将决定SRAM的大小和操作方式。 2. 设计SRAM存储器的地址和数据线路。FIFO的读写操作将通过地址线路进行,而数据将通过数据线路进行。 3. 设计读写指针。读指针用于从FIFO中读取数据,写指针用于将数据写入FIFO中。 4. 设计读写控制电路。读写控制电路用于控制读写指针的操作,以及SRAM数据的读写。 5. 设计时序电路。时序电路用于控制读写控制电路和SRAM的操作顺序,以保证正确的FIFO操作。 下面是一个简单的示例设计,假设FIFO的深度为16,数据宽度为8位: 1. SRAM大小为16x8位。 2. 地址线路使用4位地址,数据线路使用8位数据。 3. 读写指针使用4位二进制计数器,其中读指针指向FIFO的下一个数据,写指针指向FIFO的最后一个数据。 4. 读写控制电路包括以下操作: - 写入数据:将数据写入SRAM,并将写指针增加1。 - 读取数据:从SRAM读取数据,并将读指针增加1。 - 判断FIFO是否为空:如果读写指针相等,则FIFO为空。 - 判断FIFO是否已满:如果写指针的下一个位置等于读指针,则FIFO已满。 5. 时序电路包括以下操作: - 时钟脉冲:用于同步读写控制电路和SRAM操作。 - 读写控制信号:用于控制读写控制电路的操作,例如写入数据、读取数据、判断FIFO是否为空或已满等。 以上是一个简单的SRAM-based FIFO设计,实际设计可能需要更多的考虑和优化,例如数据的压缩和解压缩、FIFO的清空和重置等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值