Day05 linux高级系统设计 - 管道

复制文件描述符

dup函数

作用:

文件描述符复制

语法:

        #include <unistd.h>

        int dup (int oldfd);

参数:

        所需复制得文件描述符

返回值:

        复制到的文件描述符

功能:

        从文件描述符表中,找一个最小可能的文件描述符(通过返回值返回)作为oldfd复制

示例1:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
    int newpd = dup(1);
    write(newpd,"hello world\n",12);
    return 0;
}

dup2函数(推荐)

函数:

#include <unistd.h>

int dup2(int oldfd,int newfd);

参数:

oldfd:原文件描述符

newfd:指定复制到的文件描述符,如果该文件描述符已存在,那将已存在的关闭

示例:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char const *argv[])
{
    int fd = open("huange.txt",O_WRONLY | O_CREAT | O_APPEND,0666);
    int pd = dup2(fd,1);
    printf("娶你明年\n");
    return 0;
}

无名管道

概述

又名管道 (pipe)
无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符 ,1 个描述符写 fd[1], 1 个描述符读 fd[0]
核心:0读1写
特点
1.管道不是普通的文件,不属于某个文件管理系统,存在于内存中
2.半双工:数据在同一时间只能在单向传输
补充:
单工:指数据只能在单向传输数据
双工:指在两台通讯设备之间,允许有双向的数据传输
全双工:允许两台通讯设备之间同时进行双向数据传输。一般的电话,手机就是全双工系统,因为在讲话的同时也能听到对方的声音。
半双工:允许两台通讯设备之间进行双向数据传输,但不能同时进行。因此同一时间只允许一个设备进行传输数据,若另一设备需要传输数据,则需要等待上一个传输数据的设备传输结束后,才可以传输数据。
3.数据只允许从管道的一端写入,从管道的另一端读取
4.写入管道中的数据遵循先入先出的原则        
5.管道所传输的数据是无格式的,这要求管道的读出方和写入放提前商量好一个文件的格式,如多少字节算一则消息
6.管道在内存中对应一个缓冲区。不通的系统所对应的大小不一样。
7.数据从管道中读取是一次性操作,管道中数据一旦被读取,管道就会抛弃该数据,以便于释放空间来写入其它数据
8.管道没有名字,只能在具有公共祖先的进程中使用
        补充: 管道可以用于任意两个或更多相关进程之间的通信,只要在创建子进程 的系列调用之前通过一个共同的祖先进程创建管道即可。
        如管道可用于一个进程和其子孙进程之间的通信。第一个进程创建管道,然后创建子进程,接着子进程再创建第一个进程的孙子进程。
        管道通常用于两个兄弟进程之间的通信—— 它们的父进程创建了管道,并创建两个子进程。

pipe函数

作用:用于创建无名管道

语法:

#include <unistd.h>

int fd[] ;

pipe(fd);

参数:

fd为int型数据的首元素地址,其存放了管道的文件描述符反对fd[0],fd[1]

f[0]为读而打开管道,f[1]为写而打开

返回值:

        成功:0

        失败:-1

int fd[2];

pipe(fd);

示例:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(int argc, char const *argv[])
{
    int fd[2];
    pipe(fd);
    int i = 0;
    for(i = 0;i < 2;i++)
    {
        int pid = fork();
        if(pid == 0)
        {
            break;
        }
    }
    if(i == 0)
    {
        close (fd[0]);
        char buf[] = "hello to2";
        write(fd[1],buf,sizeof(buf));
        close(fd[1]);
        _exit(0);
    }
    else if(i == 1)
    {
        close (fd[1]);
        char buf[60] = {0};
        read(fd[0],buf,sizeof(buf));
        close(fd[0]);
        printf("%s\n",buf);
        _exit(0);
    }
    else if(i == 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHANGα

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值