精华内容
下载资源
问答
  • 转载自https://www.cnblogs.com/whzym111/p/6374855.html知识点:l 标志 置位相关指令 l 标志寄存器PSW标志寄存器PSW...8086使用了16位中的9,包括6个状态标志和3个控制标志。151413121110987654321...

    转载自https://www.cnblogs.com/whzym111/p/6374855.html

    知识点:

    标志位 置位相关指令

     

    标志寄存器PSW

    标志寄存器PSW(程序状态字寄存器PSW)    标志寄存器PSW是一个16为的寄存器。它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位。

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

     

     

     

     

    OF

    DF

    IF

    TF

    SF

    ZF

     

    AF

     

    PF

     

    CF

     

     

     

     

     

     

     

     

     

    标志

     

     

     

     

     

     

     

       CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF1,否则为0    ZF零标志:若当前的运算结果为零,则ZF1,否则为0    SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF1,否则为0。    OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0    PF奇偶标志:当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0    AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0  

       另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。    TF跟踪标志:该标志位为方面程序调试而设置。若TF=18086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。    IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。    DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。

     

    OD里能查看到 除IF标志外的 8个标志位

    JMP                        //014

    JE/JZ     //=                //012 Jump if Equl 

    JNE/JNZ  //=              //013

    //带符号数条件转移指令

    JL /JNGE  //>=  //小于  <   //015

    JLE/JNG  //>   //小于等于<=  //016

    JG/JNLE  //<=  //大于     >//017

    JGE/JNL  //<   //大于等于>=  //017

    Jump     跳转/转移

    Not      

    Equal    相等

    Zero    零

    Less    小于

    Greater 大于

    一、条件转移指令(cmp)

    助忆符

    检测的转移条件

    功能描述

     

    SETE/SETZ

    ZF=1

    Jump Equal    == 

    Jump Zero                

    SETNE/SETNZ

    ZF=0

    Jump Not Equal != 

    Jump Not Zero             

    SETG/SETNLE

    ZF=0&&SF=OF

    Jump Greater   >

    Jump Not Less or Equal    

    SETGE/SETNL

    SF=OF

    Jump Greater Equal >=

    Jump Not Less              

    SETL/SETNGE

    SF!=OF

    Jump Less   <

    Jump Not Greater or Equal  

    SETLE/SETNG

    ZF=1 || SF!=OF

    Jump Less or Equal  <=

    Jump Not Greater           

     

     

    条件置位指令

    通用写法:SETxx reg8/mem8

    作用:若条件xx成立,则dest=1,否则,dest=0

    SETxx有很多种命令形式,这里的xx只是一个描述符,具体的参见下面的三个表,其中,EEqual)表示相等,GGreatet)表示带符号大于,LLess)表示带符号小于,AAbove)表示无符号大于,BBelow)表示无符号小于。

     

    表一:用于带符号数比较的SETxx指令,这些指令常用在CMP指令之后,以判断带符号数的大小

    SETxx指令

    描述

    1条件

    SETG,SETNLE//jg/jnle

    大于(不小于等于)时置1

    SF=OFZF=0

    SETGE,SETNL

    大于等于(不小于)时置1

    SF=OF

    SETL,SETNGE

    小于(不大于等于)时置1

    SF≠OF

    SETLE,SETNG

    小于等于(不大于)时置1

    SF≠OFZF=1

     

     

    表二:用于无符号数比较的SETxx指令,常用在CMP指令之后,用来判断无符号数的大小

    SETxx指令

    描述

    1条件

    SETA,SETNBE

    大于(不小于等于)时置1

    CF=0ZF=0

    SETAE,SETNB,SETNC

    大于等于(不小于)时置1

    CF=0

    SETB,SETNAE,SETC

    小于(不大于等于)时置1

    CF=1

    SETBE,SETNA

    小于等于(不大于)时置1

    CF=1ZF=1

     

    表三:测试单个标志位的SETxx指令:

    SETxx指令

    描述

    1条件

    SETC,SETB,SETNAE

    有进位时置1

    CF=1

    SETNC,SETNB,SETAE

    无进位时置1

    CF=0

    SETZ,SETE

    0(相等)时置1

    ZF=1

    SETNA,SETNE

    0(不等)时置1

    ZF=0

    SETS

    为负时置1

    SF=1

    SETNS

    为正时置1

    SF=0

    SETO

    溢出时置1

    OF=1

    SETNO

    不溢出时置1

    OF=0

    SETP,SETPE

    ‘1’的个数为偶数时置1

    PF=1

    SETNP,SETPO

    ‘1’的个数为奇数时置1

    PF=0

     

    展开全文
  • Linux权限位中s、t

    万次阅读 2018-09-12 17:28:00
    一、UNIX下关于文件权限的表示方法和解析 SUID是Set User ID, SGID是Set GroupID的意思。 UNIX下可以用ls -l命令来看到文件的权限。...9 8 7 6 5 4 3 2 1 0 - r w x r - x r - x 第九表示文...

    一、UNIX下关于文件权限的表示方法和解析

    SUID是Set User ID, SGID是Set GroupID的意思。

    UNIX下可以用ls -l命令来看到文件的权限。用lis命令所得到的表示法的格式是类似这样的:-rwxr-xr-x。下面解释一下这些格式所标识的意思。这种表示方法一共有十位:

    9 8 7 6 5 4 3 2 1 0
    - r w x r - x r - x

    第九位表示文件类型,可以为p、d、l、s、c、b和- :

    p表示命名管道文件

    d表示目录文件

    l表示符号连接文件

    -表示普通文件

    s表示socket文件

    c表示字符设备文件

    b表示块设备文件

    第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其它用户的权限,其形式为rwx

    r表示可读,可以读出文件的内容

    w表示可写,可以修改文件的内容

    x表示可执行,可运行这个程序

    没有权限的位置用-表示

    其实再UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限:

    11 10 9 8 7 6 5 4 3 2 1 0

    S G T r w x r w x r w x

    第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

    上面的-rwsr-xr-x的值为:100111101101

    -rw-r-Sr–的值为:010110100100

    给文件加SUID和SGID的命令如下:

    设置SUID位:chmod u+s filename
    去掉SUID设置:chmod u-s filename

    设置SGID位:chmod g+s filename
    去掉SGID设置:chmod g-s filename

    另外一种方法是chmod命令用八进制表示方法的设置。

    二、SUID和SGID的详细解析

    Set UID
    会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是/etc/password与/etc/shadow。而/etc/shadow文件的权限是“-r——–”。它的拥有者是root。在这个权限中,仅有root可以“强制 ”存储,其他人是连看都不行的。

    但是,偏偏普通用户使用domestic_consumer这个一般身份用户去更新自己的密码时,使用的就是 /usr/bin/passwd程序,却可以更新自己的密码。也就是说,domestic_consumer这个一般身份用户可以存取 /etc/shadow密码文件。这怎么可能?明明 /etc/shadow就是没有dmtsai可存取的权限。这就是因为有s权限的帮助。当s权限在user的x时,也就是类似 -r-s–x–x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当domestic_consumer用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。

    SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。当然,SUID对目录是无效的。这点要特别注意。

    Set GID

    进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID。SGID可以用在两个方面。

    文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成该程序的用户组所有者(group id)。

    目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

    一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少。

    Sticky Bit

    这个Sticky Bit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除”。换句话说:当甲用户在A目录下拥有group或other的项目,且拥有w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除/重命名/移动”等操作。不过,如果将A目录加上了Sticky bit的权限,则甲只能够针对自己建立的文件或目录进行删除/重命名/移动等操作。

    举例来说,/tmp本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在 /tmp内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。这个特性也很重要。可以这样做个简单测试:

    1. 以root登入系统,并且进入/tmp中。
    2. touch test,并且更改test权限位777.
    3. 以一般用户登入,并进入/tmp。
    4. 尝试删除test文件

    SUID/SGID/SBIT权限设置

    前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字更改权限的方式为“3个数字”的组合,那么,如果在这3个数字之前再加上一个数字,最前面的数字就表示这几个属性了(注:通常我们使用chmod xyz filename的方式来设置filename的属性时,则是假设没有SUID、SGID及Sticky bit)。

    4为SUID

    2为SGID

    1为Sticky bi

    假设要将一个文件属性改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是使用“chmod 4755 filename”来设置。此外,还有大S与大T的产生。参考下面的范例(注意:下面的范例只是练习而已,所以笔者使用同一个文件来设置,必须知道,SUID不是用在目录上,SBIT不是用在文件上)。
    这里写图片描述

    # 这个例子要特别小心。怎么会出现大写的S与T呢?不都是小写的吗?
    
    # 因为s与t都是取代x参数的,但是,我们是使用
    
    # 7666。也就是说,user、group以及others都没有x这个可执行的标志
    
    # (因为666)。所以,S、T表示“空的”。
    
    # SUID是表示“该文件在执行时,具有文件拥有者的权限”,但文件
    
    # 拥有者都无法执行了,哪里来的权限给其他人使用呢?当然就是空的

    三、文件隐藏属性

    文件有隐藏属性,隐藏属性对系统有很大的帮助。尤其是在系统安全(Security)方面,非常重要。下面我们就来聊一聊如何设置和检查这些隐藏的属性。

    chattr(设置文件隐藏属性)chattr [+-=][ASacditu]文件或目录名

    参数:
    +:增加某个特殊参数,其它原本的参数不动。
    -:删除某个特殊参数,其它原本的参数不动。
    =:设置一定,且仅有后面接的参数
    A:当设置了A属性时,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免例如手提电脑有磁盘I/O错误的情况发生。
    S:这个功能有点类似sync。就是将数据同步写入磁盘中。可以有效地避免数据流失。
    a:设置a之后,这个文件只能增加数据,而不能删除,只有root才能设置这个属性。
    c:这个属性设置之后,会自定将此文件“压缩”,在读取的时候会自动解压缩,但在存储的时候,将会先进行压缩后存储(对于大文件有用)。
    d:当执行dump(备份)程序的时候,设置d属性将使该文件(或目录)具有转储功能。
    i:i的作用很大。它可以让一个文件“不能被删除、改名、设置连接,也无法写入或新增数据”。对于系统安全性有相当大的帮助。
    j:当使用ext3文件系统格式时,设置j属性将会使文件在写入时先记录在journal中。但是,当文件系统设置参数为data=journal时,由于已经设置日志了,多以这个属性无效。
    s:当文件设置了s参数时,它将会从这个硬盘空间完全删除。
    u:与s相反,当使用u来设置文件时,则数据内容其实还存在磁盘中,可以用来还原删除。

    注意:在属性上,比较常见的是a与i的设置值,而且很多设置值必须要root才能设置。

    示例:
    这里写图片描述

    如上图所示,连root用户也没有办法删除这个文件,只有解除设置可可删除。
    chattr -i attrtest

    这个命令很重要,尤其是在系统的安全性方面。由于这些属性是隐藏的,所以需要用lsattr才能看到。笔者认为,最重要的是 +i属性,因为它可以让一个文件无法被更改,对于需要很高系统安全性的人来说,相当重要。还有相当多的属性是需要root才能设置的。此外,如果是登录文件,就更需要 +a参数,使之可以增加但不能修改与删除原有的数据。将来提到登录文件时,我们再来介绍如何设置它。

    lsattr(显示文件的隐藏属性)lsattr [aR] 文件或目录

    参数:
    -a:将隐藏文件的属性也显示出来
    -R:连同子目录的数据也一并列出来

    示例:
    这里写图片描述

    使用chattr设置后,可以利用lsattr来查看隐藏属性。不过,这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如,某天你心情好,突然将 /etc/shadow这个重要的密码记录文件设置为具有i属性,那么,过了若干天之后,突然要新增用户,却一直无法新增。怎么办?将i的属性去掉即可。

    展开全文
  • linux s权限

    万次阅读 2012-03-11 13:08:53
    在解决nginx不用root用户启动的时候,发现有一个很有意思的方式,那就是用limit,并且开启s标记s标记的设计,真是管用 一、UNIX下关于文件权限的表示方法和解析 UNIX下关于文件权限的表示方法和解析...

    来源 http://hi.baidu.com/liberum/blog/item/04cadd3a8d24cdf7828b1351.html

    在解决nginx不用root用户启动的时候,发现有一个很有意思的方式,那就是用limit,并且开启s标记位,

    s标记位的设计,真是管用

    一、UNIX下关于文件权限的表示方法和解析

    UNIX下关于文件权限的表示方法和解析 

      SUID 是 Set User ID, SGID 是 Set Group ID的意思。 

      UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位: 

      9 8 7 6 5 4 3 2 1 0 

      - r w x r - x r - x 

      第9位表示文件类型,可以为p、d、l、s、c、b和-: 

      p表示命名管道文件 

      d表示目录文件 

      l表示符号连接文件 

      -表示普通文件 

      s表示socket文件 

      c表示字符设备文件 

      b表示块设备文件 

      第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx: 

      r表示可读,可以读出文件的内容 

      w表示可写,可以修改文件的内容 

      x表示可执行,可运行这个程序 

      没有权限的位置用-表示


      其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是 

      1,表示有相应的权限: 

      11 10 9 8 7 6 5 4 3 2 1 0 

      S G T r w x r w x r w x 

      第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。 

      11 10 9 8 7 6 5 4 3 2 1 0 

      上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1 

      -rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0 

      给文件加SUID和SUID的命令如下: 

      chmod u+s filename 设置SUID位 

      chmod u-s filename 去掉SUID设置 

      chmod g+s filename 设置SGID位 

      chmod g-s filename 去掉SGID设置 

      另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。

    二、SUID和SGID的详细解析

    Set UID

    会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow。而 /etc/shadow文件的权限是“-r--------”。它的拥有者是root。在这个权限中,仅有root可以“强制”存储,其他人是连看都不行的。

    但是,偏偏笔者使用dmtsai这个一般身份用户去更新自己的密码时,使用的就是 /usr/bin/passwd程序,却可以更新自己的密码。也就是说,dmtsai这个一般身份用户可以存取 /etc/shadow密码文件。这怎么可能?明明 /etc/shadow就是没有dmtsai可存取的权限。这就是因为有s权限的帮助。当s权限在user的x时,也就是类似 -r-s--x--x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当dmtsai用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。

    SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。当然,SUID对目录是无效的。这点要特别注意。

    Set GID

    进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID。SGID可以用在两个方面。

    文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成该程序的用户组所有者(group id)。

    目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

    一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少。

    Sticky Bit

    这个Sticky Bit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除”。换句话说:当甲用户在A目录下拥有group或other的项目,且拥有w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除/重命名/移动”等操作。不过,如果将A目录加上了Sticky bit的权限,则甲只能够针对自己建立的文件或目录进行删除/重命名/移动等操作。

    举例来说,/tmp本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在 /tmp内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。这个特性也很重要。可以这样做个简单测试:

    1. 以root登入系统,并且进入 /tmp中。

    2. touch test,并且更改test权限成为777。

    3. 以一般用户登入,并进入 /tmp。

    4. 尝试删除test文件。

    更多关于SUID/SGID/Sticky Bit的介绍,我们会在第11章中再次提及,当前,先有简单的概念即可。

    SUID/SGID/SBIT权限设置

    前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字更改权限的方式为“3个数字”的组合,那么,如果在这3个数字之前再加上一个数字,最前面的数字就表示这几个属性了(注:通常我们使用chmod xyz filename的方式来设置filename的属性时,则是假设没有SUID、SGID及Sticky bit)。

    4为SUID

    2为SGID

    1为Sticky bit

    假设要将一个文件属性改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是使用“chmod 4755 filename”来设置。此外,还有大S与大T的产生。参考下面的范例(注意:下面的范例只是练习而已,所以笔者使用同一个文件来设置,必须知道,SUID不是用在目录上,SBIT不是用在文件上)。

    [root@linux ~]# cd /tmp
    [root@linux tmp]# touch test
    [root@linux tmp]# chmod 4755 test; ls -l test
    -rwsr-xr-x 1 root root 0 Jul 20 11:27 test
    [root@linux tmp]# chmod 6755 test; ls -l test
    -rwsr-sr-x 1 root root 0 Jul 20 11:27 test
    [root@linux tmp]# chmod 1755 test; ls -l test
    -rwxr-xr-t 1 root root 0 Jul 20 11:27 test
    [root@linux tmp]# chmod 7666 test; ls -l test
    -rwSrwSrwT 1 root root 0 Jul 20 11:27 test

    # 这个例子要特别小心。怎么会出现大写的S与T呢?不都是小写的吗?

    # 因为s与t都是取代x参数的,但是,我们是使用

    # 7666。也就是说,user、group以及others都没有x这个可执行的标志

    # (因为666)。所以,S、T表示“空的”。

    # SUID是表示“该文件在执行时,具有文件拥有者的权限”,但文件

    # 拥有者都无法执行了,哪里来的权限给其他人使用呢?当然就是空的

    三、文件隐藏属性

    文件有隐藏属性,隐藏属性对系统有很大的帮助。尤其是在系统安全(Security)方面,非常重要。下面我们就来谈一谈如何设置与检查这些隐藏的属性。

    chattr(设置文件隐藏属性)

    [root@linux ~]# chattr [+-=][ASacdistu] 文件或目录名

    参数:

    + : 增加某个特殊参数,其他原本存在的参数不动。

    - : 删除某个特殊参数,其他原本存在的参数不动。

    = : 设置一定,且仅有后面接的参数

    A : 当设置了A属性时,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免例如手提电脑有磁盘I/O错误的情况发生。

    S : 这个功能有点类似sync。就是将数据同步写入磁盘中。可以有效地避免数据流失。

    a : 设置a之后,这个文件将只能增加数据,而不能删除,只有root才能设置这个属性。

    c : 这个属性设置之后,将会自动将此文件“压缩”,在读取的时候将会自动解压缩,但在存储的时候,将会先进行压缩后再存储(对于大文件有用)。

    d : 当执行dump(备份)程序的时候,设置d属性将可使该文件(或目录)具有转储功效。

    i : i的作用很大。它可以让一个文件“不能被删除、改名、设置连接,也无法写入或新增数据”。对于系统安全性有相当大的帮助。

    j : 当使用ext3文件系统格式时,设置j属性将会使文件在写入时先记录在journal中。但是,当文件系统设置参数为data=journalled时,由于已经设置日志了,所以这个属性无效。

    s : 当文件设置了s参数时,它将会从这个硬盘空间完全删除。

    u : 与s相反,当使用u来设置文件时,则数据内容其实还存在磁盘中,可以用来还原删除.

    注意:这个属性设置上,比较常见的是a与i的设置值,而且很多设置值必须要root才能设置。

    范例:

    [root@linux ~]# cd /tmp
    [root@linux tmp]# touch attrtest
    [root@linux tmp]# chattr +i attrtest
    [root@linux tmp]# rm attrtest
    rm: remove write-protected regular empty file `attrtest'? y
    rm: cannot remove `attrtest': Operation not permitted

    # 看到了吗?连root也没有办法删除这个文件。赶紧解除设置。

    [root@linux tmp]# chattr -i attrtest

    这个命令很重要,尤其是在系统的安全性方面。由于这些属性是隐藏的,所以需要用lsattr才能看到。笔者认为,最重要的是 +i属性,因为它可以让一个文件无法被更改,对于需要很高系统安全性的人来说,相当重要。还有相当多的属性是需要root才能设置的。此外,如果是登录文件,就更需要 +a参数,使之可以增加但不能修改与删除原有的数据。将来提到登录文件时,我们再来介绍如何设置它。

    lsattr(显示文件的隐藏属性)

    [root@linux ~]# lsattr [-aR] 文件或目录

    参数:

    -a : 将隐藏文件的属性也显示出来。

    -R : 连同子目录的数据也一并列出来。

    范例:

    [root@linux tmp]# chattr +aij attrtest

    [root@linux tmp]# lsattr

    ----ia---j--- ./attrtest

    使用chattr设置后,可以利用lsattr来查看隐藏属性。不过,这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如,某天你心情好,突然将 /etc/shadow这个重要的密码记录文件设置为具有i属性,那么,过了若干天之后,突然要新增用户,却一直无法新增。怎么办?将i的属性去掉即可。



    展开全文
  • =1)的升序序列S,处在第L/2(取整)个位置的数称为S中位数。例如,若序列S1=(11,13,15,17,19)则S1的中位数为15,若两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的...

    一个关键字为L(L>=1)的升序序列S,处在第L/2(取整)个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19)则S1的中位数为15,若两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11.现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
    首先这道题有很多种解法,下面我们来看第一种,也是大家最容易想到的一种解法,主要算法思想如下:首先因为两个序列都是升序序列,我们只需把两个序列,分别用两个数组存储,然后合并到一个数组中,最后简单粗暴直接将这数组排序,最后直接输出L/2(L为合并后数组的长度)位置上的存储的数据即可,下面我们来看代码:

    #include<iostream>
    using namespace std;
    int main(){
    	int m,n;
    	cin>>m>>n;
    	int a[m],b[n];
    	for(int i=0;i<m;i++)
    	cin>>a[i];
    	for(int i=0;i<n;i++)
    	cin>>b[i];
    	int c[m+n];
    	for(int i=0;i<m;i++){
    		c[i]=a[i];
    	}
    	int l=m+n;
    	int temp=0;
    	for(int i=m;i<l;i++){
    		c[i]=b[i-m];
    	}
    	for(int i=0;i<l;i++)
    	cout<<c[i]<<endl; 
    	for(int i=0;i<l-1;i++){//采用普通的冒泡排序 
    		for(int j=i+1;j<l;j++){
    			if(c[i]>c[j]){
    				temp=c[i];
    				c[i]=c[j];
    				c[j]=temp;
    			}
    		}
    	}
    	cout<<c[l/2-1]<<endl;
    }
    

    下面是运行结果:
    在这里插入图片描述
    从上面我们可以看出普通的冒泡排序时间复杂度太大,为O(n^2),空间复杂度为O(m+n);当然你们也可以采用其他排序方法来降低时间复杂度,但最低也为O(nlog2n),还是比较大的
    所以我想出了另一种方法,如下:

    #include<iostream>
    using namespace std;
    int M_Search(int a[],int b[],int n);
    int main(){
    	int n;
    	cin>>n;
    	int a[n],b[n];
    	for(int i=0;i<n;i++)
    	cin>>a[i];
    	for(int i=0;i<n;i++)
    	cin>>b[i];
    	int mid=M_Search(a,b,n);
    	cout<<mid<<endl;
    }
    int M_Search(int a[],int b[],int n){
    	int s1=0,d1=n-1,m1,s2=1,d2=n-1,m2;
    	//s,d,m分别代表序列A,B的首位数,末尾数和中位数
    	while(s1!=d1||s2!=d2){
    		m1=(s1+d1)/2;
    		m2=(s2+d2)/2;
    		if(a[m1]==b[m2])//满足条件1 
    		return a[m1];
    		if(a[m1]<b[m2]){//满足条件2 
    			if((s1+d1)%2==0){// 若元素个数为奇数 
    				s1=m1;//舍弃A中间结点以前的部分,且保留中间点
    				d2=m2;//舍弃B中间点以后的部分,且保留中间点 
    			}
    			else{//若元素个数为偶数 
    				s1=m1+1;//舍弃A中间点及中间点以前的部分 
    				d2=m2;//舍弃B中间点以后的部分且保留中间点 
    			}
    		}
    		else{//满足条件3 
    			if((s1+d1)%2==0){// 若元素个数为奇数 
    				d1=m1;//舍弃A中间结点以后的部分,且保留中间点
    				s2=m2;//舍弃B中间点以前的部分,且保留中间点 
    			}
    			else{//若元素个数为偶数 
    				d1=m1+1;//舍弃A中间点以后部分,且保留中间点 
    				s2=m2;//舍弃B中间点及中间点以前部分 
    			}
    		}
    	} 
    	return a[s1]>b[s2] ? a[s1]:b[s2]; 
    } 
    

    上面这个算法的时间复杂度仅为O(log2n),空间复杂度为O(1),几乎接近完美。我来解释一下这个算法。
    条件1是指两个序列的中位数相等,那么这个中位数就是要求的数,直接输出即可。条件2是指如果a数组的中位数小于b数组的中位数,那么两个序列的中位数必在a数组的中位数和b数组的中位数之间,所以我们要舍去a数组中位数以前的数和b数组后面的数。这时还要进一步细分情况,因为这两个序列长度可能都为奇数或者偶数,如果是奇数,都保留中间结点即可,但是如果两个序列长度都是偶数的话,我们要保留中位数较大那个序列的中位数,并且要舍去另一个序列的中位数。
    如此循环反复,直到两个序列均只剩下一个数,较大的那个即为所求的中位数。
    运行结果如下:
    在这里插入图片描述
    从上面两张图,我们明显可以看出同样的输入输出所花费的时间截然不同,所以方法2更优!其实方法1是可以改进的,因为原来两个序列都是升序序列,所以我们不需要一个一个的比,找到一个比第一个更小的数就可以停止第二个循环了,这种方法的时间复杂度为O(n),空间复杂度也为O(n)。这种方法虽然第一种方法更好,但是还是比第二种方法逊色一些,所以这里我就不写了。

    展开全文
  • 给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k≤n后,它能确定出S中最接近其中位数的k个数. 思考过程: 如果给出在线性时间内的算法,那么可能要用到最坏为线性时间的查找第i小元素的子...
  • Linux权限及特殊(S位

    千次阅读 2018-07-23 18:03:46
    一、UNIX下关于文件权限的表示方法和解析  SUID 是 Set User ID, SGID 是 Set Group ID的意思。   UNIX下可以用ls -l 命令来看到文件...这种表示方法一共有十:   9 8 7 6 5 4 3 2 1 0   - r w x r - x ...
  • 解释S位和T:su可以使程序以文件所属者身份执行,sg可以使程序以文件所属组身份执行,t可以阻止具有某目录写权限的普通用户删除其中的文件。     [root@localhost /]# ls -l /bin/bash  -rwxr-x
  • #include "stdio.h" void TestFunc(); long fun (long s,long t) { /**********Begin**********/ ... 0) { s = s/100; t = s%10*sl + t; sl = sl * 10; /********** End **********/ } return
  • 例如:当s中的数为:7654321时,t中的数为:7531。 #include "stdio.h" void TestFunc(); long fun (long s,long t) { /**********Begin**********/ long sl=10; t = s % 10; while(s > 0) { s = s/100; t =...
  • 为什么计算机数字符号位0表示正数,1表示负数

    万次阅读 多人点赞 2019-03-09 21:09:50
    只知道书本上说是有一个符号,当该符号0时,表示的是正数,为1时表示负数。我那时没搞懂为什么这样规定,我觉得1么,代表正数挺合理的,那么0就自然表示负数咯,所以不解,只能死记硬背:0正1负。   我个人...
  • 一、进程的文件访问权限。 一个程序在其执行过程可能要访问其他文件,当其进程要...下表的进程信息记录项是内核检查进程对文件访问权限的主要依据。 进程信息 信息意义 实际用户ID 标识是此用户在执行本进程
  • VS的scanf_s函数和scanf

    万次阅读 多人点赞 2018-06-15 18:03:22
    ANSI C没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存泄露。所以vc++2005/2008提供了scanf_s(),在最新的VS2013也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少...
  • Java实现-中位

    万次阅读 2017-06-18 14:48:42
    中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。 您在真实的面试是否遇到过这个题?  Yes 样例 给出数组[4, 5, 1, 2, 3], 返回 3 给出数组[7, 9, 4, ...
  • 例题:给定程序函数fun的功能是:从低位开始依次取长整形变量s中奇数上的数构成一个新的数放在t 例如 输入12345678 输出1357 输入123456789 输出2468 #include &lt;stdio.h&gt; #pragma warning ...
  • matlab中S函数的概念及使用

    万次阅读 多人点赞 2018-04-08 21:03:31
    有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,将其嵌入到系统。如果恰当地使用S...
  • Java实现 LeetCode 438 找到字符串所有字母异

    万次阅读 多人点赞 2020-03-16 22:45:14
    给定一个字符串 s 和一个非空字符串 p,找到 s 所有是 p 的字母异词的子串,返回这些子串的起始索引。 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。 说明: 字母异词指字母相同,但...
  • =1)的升序序列S,处在第⌈L/2⌉ 个位置的数称为S中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2= (2, 4,6,8, 20),则S1和S2...
  • C语言%c与%s的区别与划分

    万次阅读 多人点赞 2018-11-10 17:25:18
    %c格式对应的是单个字符,%s格式对应的是字符串。例:char a;char b[20];scanf("%c",&amp;a); //只能输入一个字符。scanf("%s"... //可以输入一串不超过20字符... 而%s会一直赋值,直到输入遇...
  • linux “最小权限”原则与chmod S位

    千次阅读 2013-09-16 18:09:48
    在随后进程的运行过程,进程就将可以选择将真实身份或者存储身份复制到有效身份,以拥有真实身份或者存储身份的权限。并不是所有的程序文件在执行的过程都设置存储身份的。需要这么做的程序文件会在其九(bit)...
  • python:求list的中位

    千次阅读 2016-08-09 23:40:13
    L.sort() n = len(L) m = n/2 if n == 0: print 'None' elif n%2 == 0: print "%.1f"%((L[m]+L[m-1])/2.0) ...给你一个list L, 如 L=[0,1,2,3,4], 输出L的中位数(若结果为小数,则保留一小数)。
  • lintcode两个排序数组的中位

    千次阅读 2017-08-31 18:41:27
    两个排序数组的中位数   描述 笔记  数据  评测 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。 您在真实的面试是否遇到过...
  • W.P.S.8980.12012.2019.exe工具,各位请自行下载; 链接:https://pan.baidu.com/s/1XGkCST1MpNUAAt0HNWDDcA 提取码:2mmk
  • 查找中位数(java 快速排序)

    千次阅读 2016-10-31 16:14:39
    中位数(又称中值,英语:Median),统计学的专有名词,代表一个样本、种群或概率分布的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为...
  • C语言 scanf_s和 scanf 区别

    千次阅读 2017-04-04 15:54:34
    scanf()函数是标准C...scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少字符。
  • Python%s、%d、%f意义及用法详解

    万次阅读 多人点赞 2019-05-30 10:52:28
    %s: string="hello" #%s打印时结果是hello print "string=%s" % string # output: string=hello #%2s意思是字符串长度为2,当原字符串的长度超过2时,按原长度打印,所以%2s的打印结果还是hello print ...
  • 定时器0工作方式2,定时1s

    千次阅读 2017-01-11 12:27:02
    定时器0工作方式2,定时1s
  • 网络 — MB/s、Mb/s、Mbps、Mbit/s、Kbps

    万次阅读 多人点赞 2018-10-26 15:53:07
    MB/s(兆字节每秒)、Mb/s(兆比特每秒)、Mbps(兆比特每秒)、Mbit/s(兆比特每秒)、Kbps(千比特每秒) 1Byte(字节)= 8 bit(比特) 【1B=8b】 1MB(百万字节也称兆字节)= 8 Mb 1Mb = 0.125MB 1Kb = 1024bit 1...
  • 求无序数组的中位数(c语言版本)

    千次阅读 2019-03-22 16:06:41
    在面试时,会经常被问道,如何求解一个无序数组的中位数?很多人往往都会第一感觉就是,先将该数组排序,然后找出最中间的那个数,但是这种思路通常的时间复杂度最好是O(nlogn),更糟的情况下会到O(n^2),并不是最优...
  • 官网python-3.8.3安装包(.exe),windows安装软件,各位请自行下载; 链接:https://pan.baidu.com/s/1UnCPlvNCuzCIY36R3gtC0g 提取码:4daq
  • c语言中位运算符及用法

    万次阅读 多人点赞 2018-02-22 13:23:02
    运 算一直对位运算头疼,在此总结一下 程序的所有数在计算机内存中都是以二进制的形式储存的。运算说穿了,就是直接对整数在内存的二进制进行操作。运算包括逻辑运算和移位运算,逻辑运算能够方便...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,306,207
精华内容 522,482
关键字:

中位0s