linux进程管道 linux关闭进程命令
大家好,如果您还对linux进程管道不太了解,没有关系,今天就由本站为大家分享linux进程管道的知识,包括linux关闭进程命令的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
linux进程间通讯的几种方式
一。管道(pipe)
管道是Linux支持的最初IPC方式,管道可分为无名管道,有名管道等。
(一)无名管道,它具有几个特点:
1)管道是半双工的,只能支持数据的单向流动;两进程间需要通信时需要建立起两个管道;
2)无名管道使用pipe()函数创建,只能用于父子进程或者兄弟进程之间;
3)管道对于通信的两端进程而言,实质上是一种独立的文件,只存在于内存中;
4)数据的读写操作:一个进程向管道中写数据,所写的数据添加在管道缓冲区的尾部;另一个进程在管道中缓冲区的头部读数据。
(二)有名管道
有名管道也是半双工的,不过它允许没有亲缘关系的进程间进行通信。具体点说就是,有名管道提供了一个路径名与之进行关联,以FIFO(先进先出)的形式存在于文件系统中。这样即使是不相干的进程也可以通过FIFO相互通信,只要他们能访问已经提供的路径。
值得注意的是,只有在管道有读端时,往管道中写数据才有意义。否则,向管道写数据的进程会接收到内核发出来的SIGPIPE信号;应用程序可以自定义该信号处理函数,或者直接忽略该信号。
二。信号量(semophore)
信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制。实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作(P/V)来访问。(P,V操作也常称为wait(s),signal(s))
三。信号(Signal)
信号是Unix系统中使用的最古老的进程间通信的方法之一。操作系统通过信号来通知某一进程发生了某一种预定好的事件;接收到信号的进程可以选择不同的方式处理该信号,一是可以采用默认处理机制—进程中断或退出,一是忽略该信号,还有就是自定义该信号的处理函数,执行相应的动作。
内核为进程生产信号,来响应不同的事件,这些事件就是信号源。信号源可以是:异常,其他进程,终端的中断(Ctrl-C,Ctrl+\等),作业的控制(前台,后台进程的管理等),分配额问题(cpu超时或文件过大等),内核通知(例如I/O就绪等),报警(计时器)。
四。消息队列(Message Queue)
消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息。Linux维护了一个消息队列向量表:msgque,来表示系统中所有的消息队列。
消息队列克服了信号传递信息少,管道只能支持无格式字节流和缓冲区受限的缺点。
五。共享内存(shared memory)
共享内存映射为一段可以被其他进程访问的内存。该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中。共享内存是最快的IPC机制,但由于linux本身不能实现对其同步控制,需要用户程序进行并发访问控制,因此它一般结合了其他通信机制实现了进程间的通信,例如信号量。
socket也是一种进程间的通信机制,不过它与其他通信方式主要的区别是:它可以实现不同主机间的进程通信。
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
出处:
linux下用ps -ef |grep ,结果哪个是进程号
root 13091 12287 0 07:20 pts/1 00:00:00 grep oscard中的第二列【13091】是进程号。
ps命令将某个进程显示出来,LINUX下最常用的也是非常强大的进程查看命令
grep命令是查找,全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。这是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
中间的|是管道命令是指ps命令与grep同时执行
扩展资料:
PS命令其中各项的内容意思如下:
1、参数e:显示所有程序。
2、参数f:显示UID,PPIP,C与STIME栏位
3、UID:用户ID、但输出的是用户名
4、PID:进程的ID
5、PPID:父进程ID
6、C:进程占用CPU的百分比
7、STIME:进程启动到现在的时间
8、TTY:该进程在那个终端上运行,若与终端无关,则显示?若为pts/0等,则表示由网络连接主机进程。
9、CMD:命令的名称和参数