zoukankan      html  css  js  c++  java
  • Linux面试知识点总结

    1.Linux关机重启命令:

        在linux命令中reboot重新启动shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的。
        shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。
        精确时间的格式是hh:mm,表示小时和分钟,时间段由+ 和分钟数表示。系统执行该命令后会自动进行数据同步的工作。
        该命令的一般格式: shutdown [选项] [时间] [警告信息]
        命令中各选项的含义为:
           - k 并不真正关机而只是发出警告信息给所有用户
           - r 关机后立即重新启动
           - h 关机后不重新启动
           - f 快速关机重启动时跳过fsck
           - n 快速关机不经过init 程序
           - c 取消一个已经运行的shutdown
        需要特别说明的是该命令只能由超级用户使用。
        例1,系统在十分钟后关机并且马上重新启动: # shutdown –r +10
        例2,系统马上关机并且不重新启动:# shutdown –h now
      halt是最简单的关机命令,其实际上是调用shutdown -h命令。halt执行时,杀死应用进程,文件系统写操作完成后就会停止内核。
        halt命令的部分参数如下:
         [-f] 没有调用shutdown而强制关机或重启
         [-i] 关机或重新启动之前,关掉所有的网络接口
         [-p] 关机时调用poweroff,此选项为缺省选项

        reboot的工作过程与halt类似,其作用是重新启动,而halt是关机。其参数也与halt类似。reboot命令重启动系统时是删除所有的进程,而不是平稳地终止它们。因此,使用reboot命令可以快速地关闭系统,但如果还有其它用户在该系统上工作时,就会引起数据的丢失。所以使用reboot命令的场合主要是在单用户模式。
        init是所有进程的祖先,其进程号始终为1。init用于切换系统的运行级别,切换的工作是立即完成的。init 0命令用于立即将系统运行级别切换为0,即关机;init 6命令用于将系统运行级别切换为6,即重新启动。

    2.进程对应的内存空间中所包含的5种不同的数据区:

        代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作—它是不可写的。
        数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量
        BSS段:BSS段包含了程序中未初始化的全局变量,在内存中bss段全部置零
        堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
        :栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

    3.Linux文件权限:

       为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限:
         ● 所有者权限:文件所有者能够进行的操作。
         ● 组权限:文件所属用户组能够进行的操作。
         ● 外部权限(其他权限):其他用户可以进行的操作。
        查看文件权限
        ls -l 命令可以查看与文件权限相关的信息

    $ls -l /home/amrood
    -rwxr-xr--  1 amrood   users 1024  Nov 2 00:10  myfile
    drwxr-xr--- 1 amrood   users 1024  Nov 2 00:10  mydir

        第一列就包含了文件或目录的权限。 

        第一列的字符可以分为三组,每一组有三个,每个字符都代表不同的权限,分别为读取(r)、写入(w)和执行(x)
          · 第一组字符(2-4)表示文件所有者的权限,-rwxr-xr-- 表示所有者拥有读取(r)、写入(w)和执行(x)的权限。
          · 第二组字符(5-7)表示文件所属用户组的权限,-rwxr-xr-- 表示该组拥有读取(r)和执行(x)的权限,但没有写入权限。
          · 第三组字符(8-10)表示所有其他用户的权限,rwxr-xr-- 表示其他用户只能读取(r)文件。
       文件访问模式
          文件权限是Linux系统的第一道安全防线,基本的权限有读取(r)、写入(w)和执行(x):
           · 读取:用户能够读取文件信息,查看文件内容。
           · 写入:用户可以编辑文件,可以向文件写入内容,也可以删除文件内容。
           · 执行:用户可以将文件作为程序来运行。
       目录访问模式
          目录的访问模式和文件类似,但是稍有不同:
          · 读取:用户可以查看目录中的文件
          · 写入:用户可以在当前目录中删除文件或创建文件
          · 执行:执行权限赋予用户遍历目录的权利,例如执行 cd 和 ls 命令。

        改变权限:
         chmod (change mode) 命令来改变文件或目录的访问权限,权限可以使用符号或数字来表示。
         使用符号表示权限:
         可以增加(+)和删除(-)权限,也可以指定特定权限。
         符号说明:
            +   为文件或目录增加权限
            -   删除文件或目录的权限
            =  设置指定的权限
        下面的例子将会修改testfile文件的权限:

    $ls -l testfile
    -rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile
    $chmod o+wx testfile
    $ls -l testfile
    -rwxrwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
    $chmod u-x testfile
    $ls -l testfile
    -rw-rwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
    $chmod g=rx testfile
    $ls -l testfile
    -rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

        也可以同时使用多个符号:

    $chmod o+wx,u-x,g=rx testfile
    $ls -l testfile
    -rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

         使用数字表示权限:
         除了符号,也可以使用八进制数字来指定具体权限,如下表所示:
         数字权限说明:
          0               没有任何权限                                                         ---
          1               执行权限                                                               --x
          2               写入权限                                                               -w-
          3    执行权限和写入权限:1 (执行) + 2 (写入) = 3                  -wx
          4               读取权限                                                               r--
          5    读取和执行权限:4 (读取) + 1 (执行) = 5                         r-x
          6    读取和写入权限:4 (读取) + 2 (写入) = 6                         rw-
          7    所有权限: 4 (读取) + 2 (写入) + 1 (执行) = 7                    rwx

        下面的例子,首先使用  ls -1  命令查看testfile文件的权限,然后使用chmod命令更改权限:

    $ls -l testfile
    -rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile
    $ chmod 755 testfile
    $ls -l testfile
    -rwxr-xr-x  1 amrood   users 1024  Nov 2 00:10  testfile
    $chmod 743 testfile
    $ls -l testfile
    -rwxr---wx  1 amrood   users 1024  Nov 2 00:10  testfile
    $chmod 043 testfile
    $ls -l testfile
    ----r---wx  1 amrood   users 1024  Nov 2 00:10  testfile  

        更改所有者和用户组
        在Linux中,每添加一个新用户,就会为它分配一个用户ID和群组ID,上面提到的文件权限也是基于用户和群组来分配的。

        有两个命令可以改变文件的所有者或群组:
         · chown :chown 命令是"change owner"的缩写,用来改变文件的所有者。
         · chgrp :chgrp 命令是"change group"的缩写,用来改变文件所在的群组。

        chown 命令用来更改文件所有者,其语法如下:
            $ chown user filelist
            user 可以是用户名或用户ID,例如
            $ chown amrood testfile
            $ 将testfile文件的所有者改为amrood。

        注意:超级用户 root 可以不受限制的更改文件的所有者和用户组,但是普通用户只能更改所有者是自己的文件或目录。

        chgrp 命令用来改变文件所属群组,其语法为:
            $ chgrp group filelist
            group 可以是群组名或群组ID,例如
            $ chgrp special testfile
            $ 将文件 testfile 的群组改为 special。

    4.死锁:

       产生死锁的原因主要是
       (1) 因为系统资源不足
       (2) 进程运行推进的顺序不合适
       (3) 资源分配不当等。
       如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 
       产生死锁的四个必要条件
       (1) 互斥条件:一个资源每次只能被一个进程使用。
       (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
       (3) 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
       (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
       这四个条件是死锁的必要条件 ,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 
       死锁的解除与预防
       理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

    5.fork()函数:

       不算main这个进程自身,到底创建了多少个进程啊?

    int main(int argc, char* argv[])
    {
       fork();
       fork() && fork() || fork();
       fork();
    }
         (1) A&&B||C
          A为假,跳过B,判断C;
          A为真,判断B,若B为真,跳过C;
                               若B为假,判断C.
         (2) fork()函数父进程返回子进程ID;子进程返回0
         第一条语句新增1个;
         第二条语句新增4*2个;
        第三条语句,此时已有进程1+1+4*2个,所以新增10个.
        总数为2*(2+1+2)*2=20;减去自己就是19.
  • 相关阅读:
    java 的 线程池应用和实践
    拦截信息短信息并转发到指定手机
    分享 UC优视 的android程序员面试题
    解释通讯协议中的xml
    设计模式工厂模式
    MongoDB基础教程系列第一篇 进入MongoDB世界
    Docx组件读写Word文档介绍
    [转]Oracle数据库逻辑增量备份之exp/imp
    JSON文件读取
    JAVA综合--如何掌握JDK1.5枚举类型[转]
  • 原文地址:https://www.cnblogs.com/wp5719/p/5780756.html
Copyright © 2011-2022 走看看