-i linux
2019-04-29 22:09:56 Cassiel60 阅读数 76

最近看大佬写的流程,发现这个用法也用的多,自己实践了下它的用法,才知道是什么意思

i=sftr.realgn.bam
echo ${i%%.*}
sftr


n=123,234,68
echo ${n%%,*}
123

原来是提取第一个.前面的内容

2018-05-11 09:22:00 weixin_30765475 阅读数 1

例如你要把有个变量的值和其他字符串连接起来,就需要用到{},以明示{}中的是一个变量。

例如: export var1=ABC

export var2=var1=${var1}

echo $var2

最后输出为: var1=ABC

 

转载于:https://www.cnblogs.com/xwb583312435/p/9022974.html

2014-04-18 16:12:28 trochiluses 阅读数 931

1.什么是linux I/Ostack

linux系统中,要将文件内容写入到磁盘中,需要经过VFS、具体的文件系统、设备驱动等层次,我们将这些层次叫做linux IO stack。那么linux的IO stack究竟包括哪些内容呢?我们先来看看一副图。

总结:linux的IO stack包含的是我们写入或者读取一个设备上文件或者信息的全过程,从最上面的VFS到最下面的硬件设备。分层的目的在于功能的细分和逻辑的清晰。主要有三层:VFS等文件系统层、SCSI层、硬件设备。

2.linux I/Ostack内容

I/O Stack流图分为几大部分:
1>.direct I/O 的O_Direct调用
2>.Page Cache;
3>.VFS,也即文件系统、网络通信等
4>.Block I/O层
5>.I/O调度方式;
6>.SCSI处理层;
7>.磁盘硬件设备;
其中,我们来分析一下scsi子系统的分层架构

3.scsi相关内容

3.1SCSI 工作原理

SCSI 实现了一种客户机/服务器风格的通信架构。发起者向目标设备发送命令请求。该目标处理此请求并向发起者返回响应。发起者可以是托管计算机中的一个 SCSI 设备,而 SCSI 目标则可以是一个磁盘、光盘和磁带设备或特殊设备(比如箱体设备)。
总结:客户机服务器模式

3.2SCSI 命令

SCSI 传输所采用的协议已经时过境迁,SCSI 命令却保持了最初的元素。SCSI 命令是在 Command Descriptor Block (CDB) 中定义的。CDB 包含了用来定义要执行的特定操作的操作代码,以及大量特定于操作的参数。


SCSI 命令支持读写数据(各有四个变量)以及很多非数据命令,比如 test-unit-ready(设备是否已就绪)、inquiry(检索有关目标设备的基本信息)、read-capacity(检索目标设备的存储容量)等等。目标设备支持何种命令取决于设备的类型。发起者通过 inquiry 命令识别设备类型。表 1 列出了最常用的 SCSI 命令。


命令 用途
Test unit ready 查询设备是否已经准备好进行传输
Inquiry 请求设备基本信息
Request sense 请求之前命令的错误信息
Read capacity 请求存储容量信息
Read 从设备读取数据
Write 向设备写入数据
Mode sense 请求模式页面(设备参数)
Mode select 在模式页面配置设备参数

借助大约 60 种可用命令,SCSI 可适用于许多设备(包括随机存取设备,比如磁盘和像磁带这样的顺序存储设备)。SCSI 也提供了专门的命令以访问箱体服务(比如存储箱体内部当前的传感和温度)。更多信息,请参见 参考资料 部分。

3.2Linux 内核中的 SCSI 架构


图 2 显示了 SCSI 子系统在 Linux 内核中的位置。内核的顶部是系统调用接口,处理用户空间调用到内核中合适的目的地的路由(例如 open、read 或 write)。而虚拟文件系统(VFS) 是内核中支持的大多数文件系统的抽象层。它负责将请求路由到合适的文件系统。大多数文件系统都通过缓冲区缓存来相互通信,这种缓存通过缓存最近使用的数据来优化对物理设备的访问。接下来是块设备驱动器层,它包括针对底层设备的各种块驱动器。SCSI 子系统是这种块设备驱动器之一。

与 Linux 内核中的其他主流子系统不同,SCSI 子系统是一种分层的架构,共分为三层。顶部的那层叫做较高层,代表的是内核针对 SCSI 和主要设备类型的驱动器的最高接口。接下来的是中间层,也称为公共层或统一层。在这一层包含 SCSI 堆栈的较高层和较低层的一些公共服务。最后是较低层,代表的是适用于 SCSI 的物理接口的实际驱动器(参见图 3)。

图 3. Linux SCSI 子系统的分层架构

在 ./linux/drivers/scsi 可以找到 SCSI 子系统(SCSI 较高层、中间层和各种驱动器)的源代码。SCSI 数据结构则位于 SCSI 源目录,在 ./linux/include/scsi 也可以找到。
注意:设备驱动属于scsi协议的上层

3.3SCSI 较高层


SCSI 子系统的较高层代表的是内核(设备级)最高级别的接口。它由一组驱动器组成,比如块设备(SCSI 磁盘和 SCSI CD-ROM)和字符设备(SCSI 磁带和 SCSI generic)。较高层接受来自上层(比如 VFS)的请求并将其转换成 SCSI 请求。较高层负责完成 SCSI 命令并将状态信息通知上层。

SCSI 磁盘驱动器在 ./linux/drivers/scsi/sd.c 内实现。SCSI 磁盘驱动器通过调用 register_blkdev(作为块驱动器)进行自初始化并通过scsi_register_driver 提供一组函数以表示所有 SCSI 设备。其中 sd_probe 和 sd_init_command 这两个函数很重要。只要有新的 SCSI 设备附加到系统, SCSI 中间层就会调用 sd_probe 函数。sd_probe 函数可决定此设备是否由 SCSI 磁盘驱动器管理,如果是,就创建新的 scsi_disk 结构来表示它。sd_init_command 函数将来自文件系统层的请求转变成 SCSI 读或写命令(为完成这个 I/O 请求,sd_rw_intr 会被调用)。

SCSI 磁带驱动器在 ./linux/drivers/scsi/st.c 内实现。磁带驱动器是顺序存取设备,会通过 register_chrdev_region 将自身注册为字符设备。SCSI 磁带驱动器还提供了一个 probe 函数,称为 st_probe。该函数会创建一种新磁带设备并将其添加到称为 scsi_tapes 的向量。SCSI 磁带驱动器的独特之处在于,如果可能,它可以直接从用户空间执行 I/O 传输。否则,数据会通过驱动器缓冲被分段。

SCSI CD-ROM 驱动器在 ./linux/drivers/scsi/sr.c 内实现。CD-ROM 驱动器是另一种块设备并为 SCSI 磁盘驱动器提供类似的函数集。sr_probe函数可用来创建 scsi_sd 结构以表示 CD-ROM 设备,并用 register_cdrom 注册此 CD-ROM。SCSI 磁带驱动器还会导出 sr_init_command,以将请求转换成 SCSI CD-ROM 读或写请求。

SCSI generic 驱动器在 ./linux/drivers/scsi/sg.c 内实现。该驱动器允许用户应用程序向设备发送 SCSI 命令(比如格式化、模式感知或诊断命令)。通过 sg3utils 包还可以从用户空间利用 SCSI generic 驱动器。这个用户空间包包括多种实用工具,可用来发送 SCSI 命令和解析这些命令的响应。


总结:较高层接受来自上层(比如 VFS)的请求并将其转换成 SCSI 请求。较高层负责完成 SCSI 命令并将状态信息通知上层。linux系统中的相关模块完成了各种块设备驱动。

3.4SCSI 中间层

SCSI 中间层是 SCSI 较高层和较低层的公共服务层(可以在 ./linux/drivers/scsi/scsi.c 内部分地实现)。它提供了很多可供较高层和较低层驱动器使用的函数,因而可以充当这两层间的连接层。中间层很重要,原因是它抽象化了较低层驱动器(LLD)的实现,可以在 ./linux/drivers/scsi/hosts.c 中部分地实现。这意味着可以以同样的方式使用带不同接口的 Fibre Channel 主机总线适配器(HBA)。

低层驱动器注册和错误处理都由 SCSI 中间层提供。中间层还提供了较高层和较低层间的 SCSI 命令排队。SCSI 中间层的一个重要功能是将来自较高层的命令请求转换成 SCSI 请求。它也负责管理特定于 SCSI 的错误恢复。
中间层可以连接 SCSI 子系统的较高层和较低层。它接受对 SCSI 事务的请求并对这些请求进行排队以便处理 (如 ./linux/drivers/scsi/scsi_lib.c 中所示)。当这些命令完成后,它接受来自 LLD 的 SCSI 响应并通知较较高层此请求已经完成。

中间层最重要的职责之一是错误和超时处理。如果 SCSI 命令没有在合理的时间内完成或者 SCSI 请求返回错误,中间层就会管理错误或重新发送此请求。中间层还可管理较高层恢复,比如请求 HBA (LLD) 或 SCSI 设备重置。SCSI 错误和超时处理程序在 ./linux/drivers/scsi/scsi_error.c 内实现。
总结:中间层的主要工作是公共服务,拥塞处理、错误和超时处理等

3.5SCSI 较低层

在最低层的是一组驱动器,称为 SCSI 低层驱动器。它们是一些可与物理设备(比如 HBA)链接的特定驱动器。LLD 提供了自公共中间层到特定于设备的 HBA 的一种抽象。每个 LLD 都提供了到特定底层硬件的接口,但所使用的到中间层的接口却是一组标准接口。

较低层包含大量代码,原因是它要负责处理各种不同的 SCSI 适配器类型。例如,Fibre Channel 协议包含了针对 Emulex 和 QLogic 的各种适配器的 LLD。面向 Adaptec 和 LSI 的 SAS 适配器的 LLD 也包括在内。


Linux I/O
2016-06-20 15:02:29 u011127094 阅读数 399

计算机系统中除CPU和内存外的其他设备都可以看作I/O设备。I/O设备按其工作方式的不同大体可分为字符设备、块设备(标准的计算机组成结构中这部分和内存都属于存储器)和网络设备三类。

  • 字符设备(character/raw device):以字符为单位进行传输的设备,只能顺序存取以字节为最小单位的数据,不能随机存取数据。
  • 块设备(block device):以块为单位进行传输的设备,以块为基本传输单位,可随机存取数据。
  • 网络设备:进行数据网络传输的设备,是面向数据包的传输。

Linux的内核将所有外部设备都可以看做一个文件来操作,应用程序通过调用文件操作的系统调用和内核交互,来实现外部设备的访问和操作。每一个字符设备和块设备都会在devfs文件系统(/dev/)中创建一个文件作为入口点,用户可利用基本的文件I/O操作来访问这些文件。而网络设备在devfs文件系统中没有入口点,用户需要借助socket实现网络设备的访问。

I/O操作

Linux的I/O操作根据在用户空间中操作中有无buffer可分为(与内核中有无buffer无关)bufferedI/O和unbuffered I/O两类。

  • Unbuffered I/O:Linux系统提供的I/O方法,直接使用系统调用接口来实现其open/read/write操作
  • Buffered I/O:标准 C提供的一种流操作方法,通过在用户空间创建buffer缓存操作数据来减少系统调用的次数以提高效率。

在Linux中大部分字符设备和网络设备都支持unbuffered I/O,块设备两种方法都支持。

I/O同步/异步

同步/异步是消息的通知机制。

  • 同步(synchronous):在发出一个功能调用时,在没有得到结果之前,该调用就不返回
  • 异步(asynchronous):当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理

I/O阻塞/非阻塞

阻塞/非阻塞是程序在等待消息(无所谓同步或者异步)时的状态。
  • 阻塞(blocking):调用结果返回之前当前线程会被挂起,函数只有在得到结果之后才会返回
  • 非阻塞(non-blocking):在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回
参考
http://blog.chinaunix.net/uid-26000296-id-3754118.html

2013-07-29 16:55:31 sonbai 阅读数 1120
[lingyun@localhost io]$ vim io.c
{}   
    int n;
 + io.c                                                                                                                             
/*********************************************************************************
 *      Copyright:  (C) 2013 fulinux<fulinux@sina.com> 
 *                  All rights reserved.
 *
 *       Filename:  io.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(07/29/2013~)
 *         Author:  fulinux <fulinux@sina.com>
 *      ChangeLog:  1, Release initial version on "07/29/2013 04:46:06 PM"
 *                 
 ********************************************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>


#define BUFFSIZE 4096


int main(void)
{
    int     n;
    char    buf[BUFFSIZE];
    while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if(write(STDOUT_FILENO, buf, n) != n)
        {
            perror("write error");
            exit(1);
        }
    if(n < 0)
    {
        perror("read error");
        exit(0);
    }
    exit(0);

}


[lingyun@localhost io]$ ./a.out 
hello
hello
world
world

I love linux

阅读数 323

linux I节点

阅读数 589

Linux的I节点

阅读数 3470

linux I/O

阅读数 162

Linux Primer I

阅读数 1

没有更多推荐了,返回首页