06Shell并发控制

并发控制

文件描述

文件句柄

File Descriptors (FD,文件描述符)或 文件句柄:
进程使用文件描述符来管理打开的文件

注意

1.如何通过exec打开一个文件
exec 数字<> 文件名称
数字:/proc/$$/fd中未出现的数字
文件名称:相对路径或者绝对路径

2.如何通过exec关闭一个文件(释放文件句柄)
exec 数字<&-

3.当一个文件FD没有被释放,删除原文件也不会影响FD

示例说明

[[email protected] ~]# 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
[[email protected] ~]# touch file1
# 打开文件
# exec 数字<> 文件名称
# 数字:/proc/$$/fd中未出现的数字
# 文件名称:相对路径或者绝对路径
[[email protected] ~]# exec 6<> file1
[[email protected] ~]# 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

# 编辑文件
[[email protected] ~]# echo "1111" >> /proc/$$/fd/6
[[email protected] ~]# cat /proc/$$/fd/6
1111
[[email protected] ~]# cat /root/file1
1111

# 删除文件、恢复文件
# 注意:即使恢复了file1文件,但是 `6 -> /root/file1 (deleted)`,原因是前后的file1的inode不一样
# 一个文件的句柄/描述符没有被释放,即使删除了文件,文件描述符依然在
[[email protected] ~]# rm -rf /root/file1
[[email protected] ~]# 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)
[[email protected] ~]# cat /proc/$$/fd/6
1111
[[email protected] ~]# cp /proc/$$/fd/6 /root/file1
[[email protected] ~]# cat /root/file1
1111

# 释放文件句柄
# exec 数字<&-
[[email protected] ~]# exec 6<&-   // 关闭当前进程的文件句柄6
[[email protected] ~]# 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

管道

管道本身就是文件

匿名管道

[[email protected] ~]# rpm -qa | grep bash

命名管道

先进先出,取出了就没有了

[[email protected] ~]# mkfifo /tmp/tmpfifo
[[email protected] ~]# file /tmp/tmpfifo
/tmp/tmpfifo: fifo (named pipe)
[[email protected] ~]# tty
/dev/pts/4

#打开两个终端
#终端1
[[email protected] ~]# ll /dev  > /tmp/tmpfifo
#终端2
[[email protected] ~]# 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主机:通过命名管道和文件描述符实现多进程

[[email protected] 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..."

原文地址:https://www.cnblogs.com/ElegantSmile/p/12056495.html

时间: 2024-10-23 17:40:36

06Shell并发控制的相关文章

嵌入式环境下并发控制与线程安全

嵌入式环境下并发控制与线程安全 代码规模日益增大和基于RTOS的多线程技术使嵌入式软件开发越来越关注"并发控制和线程安全",当多个执行线程(指正在运行代码的任意上下文,包括线程和中断服务程序)需要访问相同的共享资源时(包括软件数据和硬件资源),就可能因为竞态而导致错误.这种错误容易制造,但很难找到,从设计上保证正确性收益更大. 竞态的产生 当一个共享资源被多个执行线程"非原子性"访问时,一个执行线程的操作被另一个执行线程打断而带来错误就叫"竞态"

mysql的mvcc(多版本并发控制)

mysql的mvcc(多版本并发控制) 我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能. 什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号, 而每一个事务在启动的时候,都有一个唯一的递增的版本号. 1.在插入操作时 : 记录的创建版本号就是事务版本号. 比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号. id name create version delete

linux驱动程序中的并发控制

   现代操作系统有三大特性:中断处理.多任务处理和多处理器.这些特性导致当多个进程.线程或者CPU同时访问一个资源时,可能发生错误,这些错误是操作系统运行所不允许的.在操作系统中,内核需要提供并发控制机制,对共享资源进行保护.   在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行.并发容易导致竞争的问题.竞争就是两个或两个以上的进程同时访问一个资源,同时引起资源的错误.并发控制机制有以下

PostgreSQL的并发控制

9.3中文文档:http://58.58.27.50:8079/doc/html/9.3.1_zh/mvcc.html 参考博客:中文:http://www.zlovezl.cn/articles/postgresql-concurrency-with-mvcc/ 英文:https://devcenter.heroku.com/articles/postgresql-concurrency 本文描述PostgreSQL数据库系统在多个会话试图同时访问同一数据时的表现.并发控制的目标是为所有会话提

Linux驱动设备中的并发控制

一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也常常设计出包含并发问题的bug驱动程序. Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 一.基本概念 并发(concurrency):指的是多个执行单元同时.并行被执行,而并发的执行单元对共享资源(硬件资源和软件资源上的全局变量.静态变量等)的访问则很

Nodejs爬虫进阶=&gt;异步并发控制

之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬虫是上次那个的升级版,不过呢,上次那个虽

SQL_事务的并发控制

--多个用户对同一个数据操作时,一个用户的行为结果可能导致另一个用户使用的数据无效,通过事务的并发控制可以确保 --同时发生的行为与数据的有效性不发生冲突 begin transaction select * from teachers with(holdlock) --数据库加锁 waitfor delay '00:00:10' commit transaction --通过commit 或者rollback可以解锁 begin transaction update teachers set

数据库原理--事务并发控制

事务并发:指事务能够在同一时间同时执行 存在的问题: 1.丢失修改(T1和T2同时修改,T2的结果将T1的结果覆盖) 2.读脏数据(T1修改后,T2读取,但是T1撤销修改) 3.不能重复读(T1前后读的数据不同) 并发控制: 锁:互斥锁(X).共享锁(S).U锁 2段锁协议:分两个阶段,第一阶段只能申请锁:第二阶段只能释放锁 注意:2段锁并不是和一次性封锁一样,一次性对所有数据加锁,所以可能存在死锁出现

乐观的并发控制(optimistic concurrency control)

ES是分布式的.当document被create,update,或者delete,这个document的新版本就会冗余到cluster的其他node中.ES是异步和并发的,意味着冗余请求也是并行进行的,并且请求到达也是无次序的.因此需要一个方式保证老版本的document不能重写新版本的数据. 如上所述,当我们讨论index,get和delete请求,我们指出每个document都有一个_version号,这个号码随着document的变化而增长.ES使用这个_version保证document