06Shell并发控制
并发控制
文件描述
文件句柄
File Descriptors (FD,文件描述符)或 文件句柄:
进程使用文件描述符来管理打开的文件
注意
1.如何通过exec打开一个文件
exec 数字<> 文件名称
数字:/proc/$$/fd中未出现的数字
文件名称:相对路径或者绝对路径
2.如何通过exec关闭一个文件(释放文件句柄)
exec 数字<&-
3.当一个文件FD没有被释放,删除原文件也不会影响FD
示例说明
[root@hadoop04 ~]# ll /proc/$$/fd
total 0
lrwx------. 1 root root 64 Dec 10 09:18 0 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 1 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 2 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 15:21 255 -> /dev/pts/4
[root@hadoop04 ~]# touch file1
# 打开文件
# exec 数字<> 文件名称
# 数字:/proc/$$/fd中未出现的数字
# 文件名称:相对路径或者绝对路径
[root@hadoop04 ~]# exec 6<> file1
[root@hadoop04 ~]# ll /proc/$$/fd
total 0
lrwx------. 1 root root 64 Dec 10 09:18 0 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 1 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 2 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 15:21 255 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 6 -> /root/file1
# 编辑文件
[root@hadoop04 ~]# echo "1111" >> /proc/$$/fd/6
[root@hadoop04 ~]# cat /proc/$$/fd/6
1111
[root@hadoop04 ~]# cat /root/file1
1111
# 删除文件、恢复文件
# 注意:即使恢复了file1文件,但是 `6 -> /root/file1 (deleted)`,原因是前后的file1的inode不一样
# 一个文件的句柄/描述符没有被释放,即使删除了文件,文件描述符依然在
[root@hadoop04 ~]# rm -rf /root/file1
[root@hadoop04 ~]# ll /proc/$$/fd
total 0
lrwx------. 1 root root 64 Dec 10 09:18 0 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 1 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 2 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 15:21 255 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 6 -> /root/file1 (deleted)
[root@hadoop04 ~]# cat /proc/$$/fd/6
1111
[root@hadoop04 ~]# cp /proc/$$/fd/6 /root/file1
[root@hadoop04 ~]# cat /root/file1
1111
# 释放文件句柄
# exec 数字<&-
[root@hadoop04 ~]# exec 6<&- // 关闭当前进程的文件句柄6
[root@hadoop04 ~]# ll /proc/$$/fd
total 0
lrwx------. 1 root root 64 Dec 10 09:18 0 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 1 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 09:18 2 -> /dev/pts/4
lrwx------. 1 root root 64 Dec 10 15:21 255 -> /dev/pts/4
管道
管道本身就是文件

匿名管道
[root@hadoop04 ~]# rpm -qa | grep bash
命名管道
先进先出,取出了就没有了
[root@hadoop04 ~]# mkfifo /tmp/tmpfifo
[root@hadoop04 ~]# file /tmp/tmpfifo
/tmp/tmpfifo: fifo (named pipe)
[root@hadoop04 ~]# tty
/dev/pts/4
#打开两个终端
#终端1
[root@hadoop04 ~]# ll /dev > /tmp/tmpfifo
#终端2
[root@hadoop04 ~]# grep 'sda' /tmp/tmpfifo
brw-rw----. 1 root disk 8, 0 Dec 7 12:23 sda
brw-rw----. 1 root disk 8, 1 Dec 7 12:23 sda1
brw-rw----. 1 root disk 8, 2 Dec 7 12:23 sda2
并发控制案例
并发ping主机:通过命名管道和文件描述符实现多进程

[root@hadoop04 shell_concurrency_control]# vim ping_multi_thread01.sh
#!/usr/bin/bash
##########################################
# ping hosts mutil thread #
# v1.1 by ElegantSmile 10/12/2019 #
##########################################
#进程数量
thread=5
#命名管道
tmp_fifofile=/tmp/$$.fifo
mkfifo ${tmp_fifofile}
exec 8<> ${tmp_fifofile}
rm ${tmp_fifofile}
for i in `seq ${thread}`
do
# 操作文件描述8
# &8表示文件描述8
# 此处给文件描述8输入了5个回车,代表了5行内容
echo >&8
done
for i in {1..254}
do
# read -u fd
# read -u选项可以跟上文件描述符
read -u 8
# 读取文件描述符8中的内容,读到一行就开启一个后台进程
{
ip=172.22.23.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ $? -eq 0 ] ;then
echo "${ip} is up"
fi
# 每次执行完上面的循环体,就往文件描述8输入了1个回车
# 因为在read -u 8的时候读取一行就少一行,当文件描述符8的内容为空,read -u 8就再也无法读取到内容,循环就会卡在那,所以此处要每次补充一行
echo >&8
}&
done
wait
# 可以通过读或者写的方式关闭文件句柄
#exec 8<&-
exec 8>&-
echo "all ok..."
06Shell并发控制的更多相关文章
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- EntityFramework与TransactionScope事务和并发控制
最近在园子里看到一篇关于TransactionScope的文章,发现事务和并发控制是新接触Entity Framework和Transaction Scope的园友们不易理解的问题,遂组织此文跟大家共 ...
- MySQL MVCC(多版本并发控制)
概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...
- LINQ to SQL语句(13)之开放式并发控制和事务
Simultaneous Changes开放式并发控制 下表介绍 LINQ to SQL 文档中涉及开放式并发的术语: 术语 说明 并发 两个或更多用户同时尝试更新同一数据库行的情形. 并发冲突 两个 ...
- SQLite剖析之锁和并发控制
在SQLite中,锁和并发控制机制都是由pager.c模块负责处理的,用于实现ACID(Atomic.Consistent.Isolated和Durable)特性.在含有数据修改的事务中,该模块将确保 ...
- [NHibernate]并发控制
目录 写在前面 文档与系列文章 并发控制 乐观并发控制(Optimistic Concurrency) 一个例子 悲观并发控制(Pessimistic Concurrency) 总结 写在前面 上篇文 ...
- Go并发控制之sync.WaitGroup
WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...
- MVCC PostgreSQL实现事务和多版本并发控制的精华
原创文章,同步发自作者个人博客,http://www.jasongj.com/sql/mvcc/ PostgreSQL针对ACID的实现机制 事务的实现原理可以解读为RDBMS采取何种技术确保事务的A ...
- mysql事务和并发控制
谈到事务,首先想到的问题是并发控制.比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为 ...
随机推荐
- Unity BehaviorDesigner行为树基础总结
BehaviorDesigner——行为树,用于控制和实现AI逻辑,类似于这样: 上面这个行为树实现了这样的逻辑: 当Player有Input时按照Input值来移动,无Input时查找最近的可攻击目 ...
- MongoDB自学------(5)MongoDB分片
分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量. ...
- 解决HttpServletRequest的输入流只能读取一次的问题
背景 通常对安全性有要求的接口都会对请求参数做一些签名验证,而我们一般会把验签的逻辑统一放到过滤器或拦截器里,这样就不用每个接口都去重复编写验签的逻辑. 在一个项目中会有很多的接口,而不同的接口可能接 ...
- SpringBoot 和Vue前后端分离入门教程(附源码)
作者:梁小生0101 juejin.im/post/5c622fb5e51d457f9f2c2381 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计 ...
- 2018-8-10-win10-uwp-重启软件
原文:2018-8-10-win10-uwp-重启软件 title author date CreateTime categories win10 uwp 重启软件 lindexi 2018-08-1 ...
- 【踩坑系列】VS2019提示 ' the package could not be found in c\users\username\nuget\packages\. '
解决步骤 1.删除对应项目下的 obj 文件夹 2.重新生成该项目
- Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...
- ubuntu下查看(改变)本地端口开放情况,开启和关闭防火墙
查看开放端口: sudo ufw status 允许80端口开放: sudo ufw allow 允许22端口开放: sudo ufw allow 启动防火墙: sudo ufw enable 重启防 ...
- SQL Server 完整备份遇到的一个不常见的错误
1. 错误详情 有一次在手动执行数据库完整备份时遇到如下错误: 执行多次都是这个错误信息. 提示无法生成检查点,原因可能是由于系统资源(如磁盘或内存空间)不足或者有时是由于数据库损坏而造成的. 我们检 ...
- linux远程Windows服务器
Rdesktop -f ip 端口 Ctrl+alt+enter退出全屏