四、Linux--管道

本文介绍了两种管道通信方式:无名管道通过pipe()函数创建,用于父子进程间通信;有名管道通过mkfifo()函数创建,可在不同进程间传递消息。文章通过示例代码详细解释了这两种管道的工作原理及应用场景。
摘要由CSDN通过智能技术生成

1无名管道pipo()

#include<unistd.h>

int pipe(int filedes[2]);

 

返回值:成功,返回0,否则返回-1

参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。

功能:创建一个无名管道

必须在fork()前调用pipe(),否则子进程不会继承文件描述符。两个进程不共享祖先进程,就不能使用pipe。但是可以使用命名管道。

说明

管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法,当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。

图片

/*

在父进程中输入输出

*/

#include <stdio.h>

#include <unistd.h>

int main(int argc,char *argv[])

{

    pid_t pid;

    int fd[2];

    int fd1[2];

    int buf[1024];

    int i,ii;

    i = pipe(fd);//生成无名管道

if(i < 0)

    {   

        printf("the pipe0 set fail!\n");

        return -1;

    }   

    ii = pipe(fd1);

    if(ii<0)

    {   

        printf("the pipe1 set fail!\n");

        close(fd[0]);

        close(fd[1]);

        return -1;

    }   

    pid = fork();生成子进程

    if(pid)//父进程

    {   

        i = 0;

        close(fd[0]);//关闭管道fd的读

        close(fd1[1]);//关闭管道fd1的写

  while(1)

        {

            i = read(STDIN_FILENO,buf,1024);//将键盘输入的数据读到buf

            if(0 == i)//ctrl d 退出

            {

                break;

            }

            write(fd[1],buf,i);//buf数据输入到管道fd

            ii = read(fd1[0],buf,1024);将管道fd1中的数据读到buf

            write(STDOUT_FILENO,buf,ii);//buf中的数据输出到屏幕上

        }

        close(fd[1]);

        close(fd[0]);

    }

    else if(0 == pid)//子进程

    {

        close(fd1[0]);

        close(fd[1]);

        dup2(fd1[1],STDOUT_FILENO);//fd1的写文件描述符复制给STDOUT_FILENO

//则对STDOUT_FILENO操作即是对fd1[1]操作

        close(fd1[1]);//因为一个管道有两个写,为防止出错,关闭一个写

        dup2(fd[0],STDIN_FILENO);

        close(fd[0]);

        execl("./atoA","./atoA",NULL);//调用atoA执行文件,执行过程中的标准输入输出分别表示向管道fd读,向管道fd1

    }

}

/*

atoA.c

将小写字母转换为大写字母

*/

 #include <stdio.h>

#include <unistd.h>

void atoA(char *buf,int n)

{

    int i;

    for(i = 0;i<n;i++)

    {   

        if((buf[i]>='a')&&(buf[i]<='z'))

        {   

           buf[i] = buf[i]-32;

        }   

    

    }   

}

int main()

{

    char buf[1024];

    int n;

    while(1)

    {   

        n = read(STDIN_FILENO,buf,1024);//向管道fd

        if(0 == n)

        {   

            break;

        }   

        atoA(buf,n);

       write(STDOUT_FILENO,buf,n); //向管道fd1

    }   

}

2 mkfifo()

#include<sys/stat.h>

int mkfifo(const char * pathname,mode_t mode);

功能:创建一个有名管道

mkfifo ()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限。建立的FIFO文件其他进程都可以用读写一般文件的方式存取。

返回值

若成功则返回0,否则返回-1,错误原因存于errno中。

错误代码:

EACCESS 参数pathname所指定的目录路径无可执行的权限

EEXIST 参数pathname所指定的文件已存在。

ENAMETOOLONG 参数pathname的路径名称太长。

ENOENT 参数pathname包含的目录不存在

ENOSPC 文件系统的剩余空间不足

ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。

EROFS 参数pathname指定的文件存在于只读文件系统内。

### 回答1: Linux是一种操作系统,而-bash是Linux中的一种shell(命令行解释器),它允许用户在命令行中输入命令并执行它们。-bash是Linux默认的shell之一,它提供了许多有用的功能和命令,使用户能够更轻松地管理和操作系统。 ### 回答2: Linux -bash 是指 Linux 系统中的 Bash(Bourne Again SHell)终端或命令行界面。 Bash 是一种常用的 Unix shell,它是用于管理和执行命令行操作的基础工具。它允许用户在 Linux 系统上输入和执行各种命令,与系统进行交互,并管理文件和文件夹。 Linux -bash 提供了一个交互式环境,用户可以在其中执行各种命令。它可以用于执行系统管理任务,如安装软件包、配置网络设置、管理用户和权限等。此外,还可以使用 bash 脚本编写批量处理任务,实现自动化和脚本化操作。 在 -bash 终端中,用户可以使用各种命令来探索文件系统、浏览文件和文件夹、编辑文本文件等。用户可以通过输入命令和参数,实现不同的操作和功能,比如复制、移动、删除文件,修改文件权限等等。 -bash 终端也提供了强大的命令行编辑和历史纪录功能。用户可以使用上下箭头键浏览之前输入的命令,并进行修改和再次执行。此外,可以使用 Tab 键进行自动完成操作,节省输入命令的时间和工作量。 总而言之,Linux -bash 是 Linux 系统中常用的命令行界面,在系统管理、文件操作和批处理方面提供了丰富的功能和灵活性,是 Linux 用户和系统管理员必不可少的工具之一。 ### 回答3: Linux的-bash是一种命令行解释器,也称为Bourne Again SHell。Bash是Unix操作系统中最常用的shell之一,由于Linux是基于UNIX的,因此Bash也成为了Linux中最常用的shell。 -bash表示当前用户所使用的shell环境是Bash。在Linux系统中,当我们打开终端或者SSH登录到服务器时,会自动进入一个shell环境,这个环境中我们可以使用各种命令来执行各种操作。 Bash是一个功能强大且灵活的shell,它支持大量的命令,可以用于管理和操作文件、目录、进程、权限、网络等各个方面。通过Bash,我们可以输入命令并执行,也可以编写shell脚本来进行自动化操作。 在-bash下,我们可以使用各种命令来管理Linux系统,比如ls命令用于列出当前目录下的文件和子目录,cd命令用于切换目录,pwd命令用于显示当前所在的目录,mkdir命令用于创建新的目录,rm命令用于删除文件和目录,等等。 此外,Bash还支持各种运算符和控制结构,允许我们编写复杂的shell脚本来自动化任务。我们可以使用if语句来进行条件判断,使用for和while循环来进行重复操作,还可以通过管道(|)来连接多个命令,实现更复杂的操作。 总之,Linux的-bash是一种强大的命令行解释器,它为我们提供了丰富的命令和功能,使我们能够高效地管理和操作Linux系统。无论是日常使用还是系统管理,熟练掌握-bash都是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值