linux命名管道(命名管道提供程序,error:40)

linux系统将所有的资源都抽象为什么进行保存

Linux系统将所有的资源都抽象为文件进行管理。

Linux是一个类Unix操作系统,它遵循Unix的设计哲学,其中之一就是“一切皆文件”。这种设计思想的核心是,无论是硬件设备、系统资源还是应用程序的接口,都被视为文件。这样做的好处是简化了资源管理的方式,统一了访问接口,并提供了强大的可扩展性和灵活性。

例如,在Linux系统中,硬件设备如硬盘、鼠标、键盘等都被抽象为文件。这些设备文件通常存放在/dev目录下。比如,第一个SATA硬盘被抽象为/dev/sda文件,而硬盘的分区则被抽象为/dev/sda1、/dev/sda2等文件。用户和应用程序可以通过对这些设备文件的读写操作,实现对硬件设备的控制。

此外,Linux中的进程间通信机制,如管道(pipe)、命名管道(named pipe)、信号(signal)等,也被抽象为文件。这些特殊的文件提供了进程间数据交换和控制的手段。例如,管道允许一个进程的输出直接作为另一个进程的输入,这在Shell脚本编程中经常被用来实现进程间的协同工作。

再者,Linux中的网络套接字(socket)也是文件抽象的一个典型例子。网络套接字允许应用程序与网络连接进行交互,发送和接收数据。通过对套接字的读写操作,就像操作普通文件一样,程序可以实现网络通信。

总之,“一切皆文件”的设计哲学,不仅简化了Linux系统内部的结构和复杂性,还使得用户可以以一致和直观的方式与系统进行交互。这种抽象方式提高了系统的可维护性和可移植性,并为开发者提供了一个统一且强大的编程接口。

linux借用外部命令expr,实现计算器功能,利用管道,进程

test指令(使用指令man查询)

功能:检查文件类型,值比较。

test的各种参数和使用。

test EXPRESSION1–a EXPRESSION2

当表达式1和表达式2同时为真时值为真

test EXPRESSION1–o EXPRESSION2

当表达式1或者表达式2为真时值为真

test–n STRING

或者

test STRING

当STRING串的长度不为零时值为真

test–z STRING

当STRING串长度为零时值为真

test STRING1= STRING2

当STRING1和STRING2相同时值为真

test STRING1!= STRING2

当STRING1和 STRING2不同时值为真

test INTEGER1–eq INTEGER2

当INTEGER1等于INTEGER2时值为真

test INTEGER1–ge INTEGER2

当INTEGER1大于或者等于INTEGER2时值为真

test INTEGER1–gt INTEGER2

当INTEGER1大于INTEGER2时值为真

test INTEGER1–le INTEGER2

当INTEGER1小于等于INTEGER2时值为真

test INTEGER1–lt INTEGER2

当INTEGER1小于INTEGER2时值为真

test INTEGER1–ne INTEGER2

当INTEGER1不等于INTEGER2时值为真

test FILE1–ef FILE2

当FILE1和FILE2有同样的device和inode号时为真(详细见linux文件学习笔记)

test FILE1–nt FILE2

当FILE1修改时间比FILE2新时值为真

test FILE1–ot FILE2

当FILE1修改时间比FILE2旧时值为真

test–b FILE

FILE存在并且内容是block类型的

test–c FILE

FILE存在并且是字符类型的

test–d FILE

FILE存在并且是一个目录

test–e FILE

FILE是否存在

test–f FILE

FILE存在并且是一个正则表达式类型的文档

test–g FILE

FILE存在并且是 set-group-ID也就是SGID(详细见后文学习笔记)

test–G FILE

FILE存在并且由有效的GROUP ID所拥有(详细见后文学习笔记)

test–h FILE

FILE存在并且是一个符号链接(详细见后文学习笔记)

test–k FILE

FILE存在并且设置了sticky bit set(详细见后文学习笔记)

test–L FILE

FILE存在并且是一个符号链接

test–O FILE

FILE存在并且由一个有效的USER ID所拥有

test–p FILE

FILE存在并且是一个命名管道(命名管道见后文学习笔记)

test–r FILE

FILE存在并且授予了可读的权限

test–s FILE

FILE存在并且size大于0

test–S FILE

FILE存在并且是一个socket

test–t FD

文件的描述符FD在终端打开

test–u FILE

FILE存在并且SUID已经被设置

test–w FILE

FILE存在并且授予了写操作权限

test–x FILE

FILE存在并且授予了可执行的权限

----------------------------------------------------------------------------------------------------------------------------------------------------

expr

expr是linux的手工命令行计数器,它可以帮助我们完成一些基本的表达式值运算。同时它也是一个字符串处理工具

(1)整数运算

$expr ARG1| ARG2

$expr ARG1& ARG2

$expr ARG1< ARG2

$expr ARG1<= ARG2

$expr ARG1= ARG2

$expr ARG1!= ARG2

$expr ARG1>= ARG2

$expr ARG1> ARG2

$expr ARG1+ ARG2

$expr ARG1– ARG2

$expr ARG1* ARG2

使用乘法时,需要使用反斜杠进行转义

$expr ARG1% ARG2

(2)字符串操作

$expr length“xxx”//计算字符串长度

$expr substr“this is a”pos length//从第pos位开始截取length长度的子串

$expr index“tesr”e//获取e在主串中首次出现的位置

(3)增量计数

例子

loop=3

loop=`expr$loop+ 1`

echo$loop

结果是4,在第二行代码中,使用反引号,shell会将反引号中的内容作为一个系统命令,这样一来,就好像我们在命令行内输入了expr$loop+ 1然后这个命令的返回结果被赋值到loop。

(4)模式匹配(按照正则表达式模式匹配串)

通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。

> VALUE=account.doc

> expr$VALUE:’.*’

8

在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。

$expr$VALUE:‘\(.*\).doc’

accounts

(5)其他

+ TOKEN

将TOKEN解释为串,不管它是一个关键字或者一个操作符

延伸知识:

引号的作用

1双引号(“”)

1)使用””可引用除字符$(美元符号)、`(反引号)、\(反斜线)外的任意字符或字符串。双引号不会阻止shell对这三个字符做特殊处理(标示变量名、命令替换、反斜线转义)。

Eg:name=gezn; echo“User name:$name”//将打印User name:gezn

Echo“The date is:`date+date-%d-%m-%Y`”//将打印The date is: 03-05-2009

Echo–e“$USER\t$UID”//将打印gezn 500

2)如果要查新包含空格的字符串经常用到双引号

2单引号(’’)

1)如果用单引号把字符串括起来,则dayi9nhao内字符串中的任何特殊字符的特殊含义均被屏蔽。

2)举例:echo–e‘$USER\t$UID’//将打印$USER$UID(没有屏蔽\t,是因为选项“-e”的缘故)

echo‘USER\t$UID’//将打印$USER\t$UID

3反引号(``)

1) shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量

2)举例:a=`date+ date-%d-%m-%Y`//将打印The date is: 03-05-2009

4.反斜线(\)

1)如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。

2)下属字符包含有特殊含义:&*+$ `“|?

3)在打印字符串时要加入八进制字符(ASCII相应字符)时,必须在前面加反斜线,否则shell作普通数字处。

举例: bj=Beijing; echo”variable\$bj=$bj”//将打印variable$bj= beijing

------------------------------------------------------------------------------------------------------------------------------------------------

Shell特殊变量

在Shell中,预先定义了几个有特殊含义的Shell变量,它们的值只能由Shell根据实际情况进行赋值,而不能通过用户重新设置。shell的特殊变量包括它的位置和一些系统变量.

(一)常用位置变量:

$#命令行上实际参数的个数,但不包含Shell脚本名。

$?上一条命令执行后的返回值(也称作“退出码”)。它是一个十进制数。多数Shell命令执行成功时,则返回值为0;如果执行失败,则返回非0值。

$$当前进程的进程号。

$!上一个后台命令对应的进程号,这是一个由1~5位数字构成的数字串。

$-由当前Shell设置的执行标志名组成的字符串。例如:

set-xv这个命令行给Shell设置了标志-x和-v(用于跟踪输出)。

$*表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。

$@它与$*基本功能相同,但是使用时加引号,并在引号中返回每个参数

$0脚本名称

$1..$9第N个参数

下面的aaa bbb为变量名

${aaa:-bbb}如果$aaa为空或未定义,则取值$bbb.否则取值$aaa

${aaa:+bbb}如果$aaa非空,则取值$bbb,否则取值为空

${aaa:=bbb}如果$aaa非空,则取值$aaa,否则取值$bbb而且赋值(aaa=bbb)

${aaa:3}如果aaa=abcdefg,则${aaa:3}的值为:defg,相当于substr,计数从0开始

${aaa:3:2}如上;${aaa:3:2}取值为: de.相当于substr

${#aaa}字符串$aaa的长度.

(二)常用系统变量:

$HOME用户的主目录

$USER用户名称

$GROUP用户所属组名

$PATH默认的搜索路径

$HOSTNAME主机名称

$TZ时区

$MAIL存放邮件的路径名

练手:

#!/bin/bash

echo$0

echo$*

echo$@

echo$#

echo$$

echo$_

在terminal窗口中执行:

./test.sh-a-b–c/home

./test.sh

-a-b-c/home

-a-b-c/home

4

3250

/home

区别$*和$@编写如下test.sh脚本:

#!/bin/bash

function testargs

{

echo"$# args"

}

testargs"$*"

testargs"$@"

unset-f testargs

在terminal窗口中执行:

./test.sh-a-b/home

1 args//很明显就一个嘛,传入的是$*这个串,不是解释后的参数

3 args//$@必须和引号搭配,所以结果正确

#!/bin/bash

function testargs

{

echo"$# args"

}

testargs$*

testargs$@

unset-f testargs

再次执行有:

./test.sh-a-b/home

3 args

3 args

作者:Aga.J

出处:

命名管道是什么意思

命名管道是一种特殊的文件,它在进程间通信中发挥着重要作用。它允许一个进程向另一个进程发送数据,而无需在它们之间建立直接的通信链接。命名管道在文件系统中以文件的形式存在,并具有一个与之关联的名称,因此得名“命名管道”。

命名管道的主要特点包括:

1.持久性:命名管道在文件系统中作为文件存在,这意味着它们可以跨越多个进程的生命周期存在。一旦命名管道被创建,只要它不被显式删除,它就可以持续存在,供不同的进程在不同的时间进行通信。

2.通信机制:命名管道提供了一种单向的通信机制。一个进程可以将数据写入管道,而另一个进程可以从管道中读取这些数据。这种通信方式允许进程异步地交换数据,即一个进程可以在写入数据后立即继续执行,而另一个进程可以在稍后的时间读取这些数据。

3.命名和寻址:由于命名管道具有与之关联的名称,因此它们可以在文件系统的任何位置被创建和访问。这使得命名管道成为一种灵活的通信机制,可以在不同的进程和不同的系统之间建立通信。

命名管道在多种场景中都很有用,特别是在需要不同进程间通信的情况下。例如,在Unix和Linux系统中,命名管道经常用于shell脚本中的进程间通信,或者在系统服务和应用程序之间进行通信。通过使用命名管道,这些进程可以以一种简单而有效的方式交换数据和信息。

总之,命名管道是一种特殊的文件,用于在进程间进行通信。它们具有持久性、通信机制和命名寻址等特点,使得它们成为一种灵活且有效的进程间通信工具。无论是在系统编程、网络编程还是应用程序开发中,命名管道都发挥着重要的作用。

阅读剩余
THE END