Linux
- Linux进程间通信方式: 管道,信号,消息队列,共享内存,信号量,套接字
- Linux线程间通信: 互斥锁,信号量,条件变量
- 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
tar
是操作.tar
命令,gzip
是压缩.gz
压缩包命令,compress
压缩.Z
文件,uncompress
解压缩.Z
文件BSS
通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清零。- 数据段: 数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
- 代码段: 代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
- 堆: 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
- 栈(stack): 栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
/etc
:配置文件,/bin
:二进制文件,即可执行文件,/dev
:存放外部设备文件,/lib
:存放库文件,/sbin
:重要系统执行文件- 硬连接与软连接的理解
- fork()是全部复制,vfork()是共享内存,clone()是可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定。另外,clone()返回的是子进程的pid。clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等
- 用户态切换到内核态方式: 系统调用,异常,外围设备中断
- FTP的默认端口是20,21,FTP的端口号20、21的区别一个是数据端口,一个是控制端口,控制端口一般为21,而数据端口不一定是20,这和FTP的应用模式有关,如果是主动模式,应该为20,如果为被动模式,由服务器端和客户端协商而定
- lpr命令 用于将文件发送给指定打印机进行打印,如果不指定目标打印机,则使用默认打印机
- 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: ①
which
查看可执行文件的位置,②whereis
查看文件的位置,③locate
配合数据库查看文件位置④find
实际搜寻硬盘查询文件名称 /etc/bash.bashrc
对所有用户起作用,~/.bashrc
是对当前home目录的用户起作用,也就是当前用户- 内核分为四个子系统:进程管理系统,内存管理系统,I/O管理系统,文件管理系统
- 系统调用通过中断完成,这一过程由用户态变为内核态,在内核态下,系统可以无限制的访问内核资源。
- 文件描述符: 0:标准输入设备;1:标准输出设备;2:标准错误输出设备
netstat
指令可以查询到目前所有主机有开启的网络服务端口- 几个常见port与网络服务的关系,①80:www;②22:ssh;③21:ftp;④25:mail;⑤111:RPC(远程过程调用);⑥631:CUPS(打印服务功能)
- 任何
shell
都会执行exec
和fork
C/C++
- 面向对象核心思想:数据抽象,继承和动态绑定
- malloc/free与new/delete的区别
- malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符
- 对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free
- new自动计算需要分配的空间,而malloc需要手工计算字节数
- 动态库的函数到实际使用的时候才加载到内存,所以运行速度较慢
- 位运算符作用于整形运算对象
- 静态成员变量不可以在类内初始化,但是静态常量成员变量可以