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.
  • 相关阅读:
    【Codeforces 349B】Color the Fence
    【Codeforces 459D】Pashmak and Parmida's problem
    【Codeforces 467C】George and Job
    【Codeforces 161D】Distance in Tree
    【Codeforces 522A】Reposts
    【Codeforces 225C】Barcode
    【Codeforces 446A】DZY Loves Sequences
    【Codeforces 429B】Working out
    【Codeforces 478C】Table Decorations
    【Codeforces 478C】Table Decorations
  • 原文地址:https://www.cnblogs.com/wp5719/p/5780756.html
Copyright © 2011-2022 走看看