100次 for linux
2017-04-25 23:28:42 wr339988 阅读数 14445

前言

循环不管在程序中还是脚本中都需要经常用到,在写shell脚本时,经常需要for进行100次循环。这里谈谈几种从1到100的循环方法。

四种方法

C语言风格

for ((i=1; i<=100; i++))
do
    echo $i
done

Python风格(in的使用)

for i in {1..100}
do
    echo $i
done

Seq的使用

注意代码中不是单引号。

for i `seq 1 100`
do
    echo $i
done
2019-03-07 14:33:00 weixin_34406061 阅读数 14

前言

循环不管在程序中还是脚本中都需要经常用到,在写shell脚本时,经常需要for进行100次循环。这里谈谈几种从1到100的循环方法。

四种方法

C语言风格

for ((i=1; i<=100; i++))
do    
echo $i
done

Python风格(in的使用)

for i in {1..100}
do   
 echo $i
done

Seq的使用

注意代码中不是单引号。

for i `seq 1 100`
do    
echo $i
done
2018-09-08 13:48:29 qq_30591163 阅读数 367

linux已用100%

这里写图片描述
存储空间耗尽,但是服务器上并没有太多的东西。
回到根目录,查看一下文件大小

cd /
du -h --max-depth=1

这里写图片描述

cd /var/
du -h --max-depth=1

这里写图片描述
确认一下,如果异常删除就好。
删除之后
这里写图片描述

2013-11-25 11:41:01 haima1998 阅读数 646

转自:http://blog.chinaunix.net/uid-24460251-id-2606762.html


分配并注册主次设备号
    设备号是在驱动module中分配并注册的,也就是说,驱动module拥有这个设备号(我的理解),而/dev目录下的设备文件是根据这个设备号创建的,因此,当访问/dev目录下的设备文件时,驱动module就知道,自己该出场服务了(当然是由内核通知)。
    在Linux内核看来,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而次设备号则用来标识具体且唯一的某个设备。
    在内核中,用dev_t类型(其实就是一个32位的无符号整数)的变量来保存设备的主次设备号,其中高12位表示主设备号,低20位表示次设备号。
    设备获得主次设备号有两种方式:一种是手动给定一个32位数,并将它与设备联系起来(即用某个函数注册);另一种是调用系统函数给设备动态分配一个主次设备号。

对于手动给定一个主次设备号,使用以下函数:
int register_chrdev_region(dev_t         first, 
                           unsigned int -count, 
                           char          *name)
    其中first是我们手动给定的设备号,count是所请求的连续设备号的个数,而name是和该设备号范围关联的设备名称,它将出现在/proc/devices和sysfs中。
    比如,若first为0x3FFFF0,count为0x5,那么该函数就会为5个设备注册设备号,分别是0x3FFFF0、 0x3FFFF1、 0x3FFFF2、 0x3FFFF3、 0x3FFFF4,其中0x3(高12位)为这5个设备所共有的主设备号(也就是说这5个设备都使用同一个驱动程序)。而0xFFFF0、 0xFFFF1、 0xFFFF2、 0xFFFF3、 0xFFFF4就分别是这5个设备的次设备号了。需要注意的是,若count的值太大了,那么所请求的设备号范围可能会和下一个主设备号重叠。比如若 first还是为0x3FFFF0,而count为0x11,那么first+count=0x400001,也就是说为最后两个设备分配的主设备号已经不是0x3,而是0x4了!用这种方法注册设备号有一个缺点,那就是若该驱动module被其他人广泛使用,那么无法保证注册的设备号是其他人的 Linux系统中未分配使用的设备号。


对于动态分配设备号,使用以下函数:
int alloc_chrdev_region(dev_t         *dev, 
                        unsigned int -
firstminor, 
                        unsigned int 
-
count, 
                        char          *name)
    该函数需要传递给它指定的第一个次设备号firstminor(一般为0)和要分配的设备数count,以及设备名,调用该函数后自动分配得到的设备号保存在dev中。动态分配设备号可以避免手动指定设备号时带来的缺点,但是它却也有自己的缺点,那就是无法预先在/dev下创建设备节点,因为动态分配设备号不能保证在每次加载驱动module时始终一致(其实若在两次加载同一个驱动module之间并没有加载其他的module,那么自动分配的设备号还是一致的,因为内核分配设备号并不是随机的,但是书上说某些内核开发人员预示不久的将来会用随机方式进行处理),不过,这个缺点可以避免,因为在加载驱动module后,我们可以读取/proc/devices文件以获得Linux内核分配给该设备的主设备号。

与主次设备号相关的3个宏:
MAJOR(dev_t dev):根据设备号dev获得主设备号;
MINOR(dev_t dev):根据设备号dev获得次设备号;
MKDEV(int major, int minor):根据主设备号major和次设备号minor构建设备号。

 

 

另解:

      Linux的设备管理是和文件系统紧密结合的,把设备和文件关联起来,这样系统调用可以直接用操作文件一样的方法来操作设备。各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。


2019-02-20 15:38:10 cxyzyywoaini 阅读数 35

3次握手

1、大多数情况下,客户端往服务端发送一个数据包,标志位为SYN(表示建立连接),包号为1000(自己定),数据包的大小为0;<mss 1460>表示数据大小的上限是1460字节;

2、服务端在收到客户端的数据包之后,表示收到数据包,发送ACK 1001回写给客户端,ACK是标志位,1001 =1000+1 表示收到客户端发送的1000包号 + 一位标志位SYN,总共1001【表示1001以前的数据包都收到了】;然后回写SYN 8000(自己定)给客户端,大小为0(表示建立连接),数据大小的上限为1024;

3、客户端在收到服务端的信息后,回写ACK 8001 ;表示8001以前的数据包都收到了;

这个过程在内核中发生,体现在用户层上为,connect()、accept()这两个函数;

数据通信

1、在下图的4标号那里,先回写ACK 8001,再次表示收到握手完成是收到的8001以前的数据包;同时发送数据包1001大小为20给服务端(1001是在前面握手的客户端发送1000数据包的基础上往上加);

2、服务端回写ACK 1021 表示收到客户端的1021以前的数据包;同时也发送8001数据包大小为10(8001同样是在前面3次握手数据包的名字8000往上加的);

3、客户端回写ACK 8011 表示收到服务端发送的数据包8011(8001+10)以前的数据包。

在这个过程中,并不是发送一条回写一条的,这样效率会收到制约,在滑动窗口的机制上,同时发送好几条数据包,服务端再回写一定的ACK表示都收到前面的数据包了(回写消息表示是否收到前面发送的数据包,是TCP区别与UDP更准确,不丢失数据的原理)。

 

4次挥手

1、大多数情况下由客户端先向服务端发送一个标志位FIN(表示结束连接),数据包例如上图的1021(是在前面通讯使用到了那个数据包的基础上,累加起来的),大小为0;同时回写ACK 8011表示收到了之前8011以前的数据包

2、服务端回写客户端ACK 1022 表示收到1021以前的数据包;

3、服务端向客户端表示我这边也要关闭通信了,发送FIN8011 (0);同时回写ACK 1022 再次表示收到了之前的数据包;

4、客户端向服务端发送ACK 8012 表示我收到了你要关闭通信的消息

关闭时的4次挥手比建立通讯时的3次握手多一个过程的原因是因为:关闭(FIN)是一个半关闭的过程,1、先是客户端先表示我要关闭通信了(关闭套接字中的写缓冲区);2、服务端也要发送消息表示我也要关闭通信了;在握手的过程中不存在半连接这种动作。

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