Linux 系统编程笔记-(1)基本概念

一.UNIX与Linux发展史

1965 年,Bell 实验室、MIT、GE(通用电气公司)准备开发 Multics 系统,为了同时支持 300 个终端访问主机,但是 1969 年失败了;

1969 年,Ken Thompson(C语言之父)利用汇编语言开发了 FIle Server System(Unics,即 UNIX 的原型);

1973 年,Dennis Ritchie 和 Ken Thompson 发明了 C 语言,而后写出了 UNIX 的内核;

1977 年,Berkeley 大学的 Bill Joy 针对他的机器修改 UNIX 源码,称为BSD(Berkeley Software Distribution);

1979 年,UNIX 发布 System V,用于个人计算机;

1984 年,因为 UNIX 规定:“不能对学生提供源码”,Tanenbaum 老师自己编写兼容于 UNIX 的Minix,用于教学;

1984 年,Stallman 开始 GNU(GNU's Not Unix)项目,创办 FSF(Free Software Foundation)基金会;

1991 年,芬兰赫尔辛基大学的研究生 Linus Torvalds 基于 gcc、bash 开发了针对 386 机器的 Linux 内核;

二.BSD和System V

在后面的学习中,会频繁设计到BSD和System V两个名词,所以这里有必要描述并区分它们.

BSD和System V是UNIX系统的两大分支.

命名为BSD(伯克利软件发布,Berkeley Software Distribution)的UNIX版本是由加州大学伯克利分校的计算机系统研究组开发并发布的.在1983年发布的4.2BSD版本中,实现了完整的TCP/IP协议栈,包括套接字API以及各种网络工具.

同1983年,UNIX支撑团队(UNIX Support Group, USG)推出了收个System V发布版.它纳入了BSD的诸多特性,包括联网能力.

三.操作系统的核心-内核

内核是管理和分配计算机资源(如CPU, RAM和设备)的核心层软件.一般,Linux内核可执行文件采用/boot/vmlinuz或与之类似的路径名.输入以下命令可以看到.

$ ls -l /boot/vmlinuz*
-rw------- 1 root root 8255344 8月  24 21:39 /boot/vmlinuz-4.15.0-29deepin-generic

内核执行的主要任务包括:

1. 进程调度.

Linux属于抢占式多任务操作系统."多任务"指多个进程可以同事驻留内存,"抢占"是指一组规则,它控制进程获得CPU的使用,以及每个进程能占用CPU多长时间,这两者都由进程调度程序决定.

2. 内存管理.

物理内存(RAM)属于有限资源,所以内核必须公平,高效的在进程间共享这一资源.

Linux采用了虚拟内存管理机制,这项技术主要有两项优势

  • 进程与进程 ,内核与内核之间彼此隔离,因此,一个进程无法读取和修改内核和其他进程的内存内容.
  • 只需将进程的一部分驻留内存中.从而RAM中可以同时加载更多的进程,提高了CPU资源的利用率

3. 提供了文件系统.

4. 创建和终止进程

5. 对设备的访问

6.联网

7.提供系统调用应用程序接口(API)

进程可以利用内核入口点(也称系统调用)请求内核去执行各种任务

内核态和用户态:

Linux系统把CPU的运行状态分为内核态和用户态,执行硬件指令可以使CPU在两种状态间切换.

虚拟内存区域也被划分为用户内存区域和内核内存区域.

CPU处于用户态时,只能访问被标记为用户空间的内存区域.

CPU处于内核态时无限制.

这确保了用户进程既不能访问内核指令和数据结构,也无法执行不利于系统运行的操作.

如果没有内核?

进程间彼此不能直接通信,进程本身无法创建新进程,哪怕"自行了断"都不行.进程也不能与计算机外界的输入输出设备直接通信,要完成这些功能,都需要进程向内核提出请求,由内核来完成.

四:用户和组

系统对每个用户的身份做唯一标识,用户可以属于多个组

五:Linux的单根目录层级,目录,链接及文件

 内核维护着一套单根目录结构,以放置系统的所有文件.

文件类型:

包括普通文件,设备,管道,套接字,目录以及符号链接.

路径和符号链接:

目录是一种特殊类型的文件,内容采用表格形式,数据项包括文件名以及相应文件的引用."文件名+引用"的组合被称为链接,每个文件可以有多个链接.符号链接则是进过特殊标记的文件,内容包含另一个文件的名称.下面是用tree命令输出的根目录文件结构(tree命令需要自行安装)

$ tree -L 1 /
/
├── bin
├── boot
├── dev
├── etc
├── home
├── initrd.img -> boot/initrd.img-4.15.0-29deepin-generic
├── initrd.img.old -> boot/initrd.img-4.15.0-29deepin-generic
├── lastore
├── lib
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
├── var
├── vmlinuz -> boot/vmlinuz-4.15.0-29deepin-generic
└── vmlinuz.old -> boot/vmlinuz-4.15.0-29deepin-generic

 

六:进程

学过操作系统的都很清楚,运行中的程序叫进程.

逻辑上经常可以划分为以下几部分

  • 文本:程序的指令,代码段
  • 数据:程序使用的静态变量
  • 堆:程序可从该区域动态分配额外内存
  • 栈:随函数调用,返回,而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间.

下面来说一下Linux中两个特殊的进程:

 

init进程:

系统引导时,内核会创建一个名为init的特殊进程,它是所有进程之父,该进程对应的程序文件为/sbin/init

 

守护进程:

守护进程是指具有特殊用途的进程,系统创建和处理此类进程的方式与其他进程相同,但以下特征是其所独有的:

  • "长生不老".守护进程通常在系统引导时启动,直至系统关闭前,一直"健在"
  • 在后台运行,无控制终端.

httpd就是著名的守护进程

 

环境变量

每个进程都有一份环境列表,由fork()创建的新进程会继承父进程的环境副本.这也为父子进程通信提供了一种机制,当调用exec()替换当前进程时,新进程要么继承老进程的环境,要么指定新环境.

#include 
//该c程序可以打印出当前系统的环境变量
extern char ** environ; //引入外部变量
int main()
{
    int i = 0;
    while (environ[i] != NULL) {
        puts(environ[i]);
        ++i;
    }
    return 0;
}

执行结果: 

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/home/wgy/software/java/jdk1.8.0_201/bin:/home/wgy/software/java/jdk1.8.0_201/jre/bin:/home/wgy/software/spring-2.2.0.BUILD-SNAPSHOT/bin:/home/wgy/software/apache-maven-3.6.0/bin
XAUTHORITY=/home/wgy/.Xauthority
XMODIFIERS=@im=fcitx
XDG_DATA_DIRS=/home/wgy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
GDMSESSION=deepin
GTK_IM_MODULE=fcitx
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_CURRENT_DESKTOP=Deepin
JRE_HOME=/home/wgy/software/java/jdk1.8.0_201/jre
COLORTERM=truecolor
QT4_IM_MODULE=fcitx
LOGNAME=wgy
PWD=/home/wgy/CLionProjects/unix/cmake-build-debug
LANGUAGE=zh_CN
SHELL=/bin/bash
QT_SCALE_FACTOR=
QT_DBL_CLICK_DIST=15
GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/deepin-terminal.desktop
OLDPWD=/home/wgy/software/clion-2018.3.3/bin
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
CLUTTER_IM_MODULE=xim
IBUS_DISABLE_SNOOPER=1
SPRING_HOME=/home/wgy/software/spring-2.2.0.BUILD-SNAPSHOT
JAVA_PATH=/home/wgy/software/java/jdk1.8.0_201/bin:/home/wgy/software/java/jdk1.8.0_201/jre/bin
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
_JAVA_OPTIONS=  -Dawt.useSystemAAFontSettings=gasp
XDG_SESSION_DESKTOP=deepin
LS_COLORS=bd=38;5;68;1:ca=38;5;17:cd=38;5;132;1:di=38;5;105:do=38;5;127:ex=38;5;80:pi=38;5;126:fi=38;5;167:ln=38;5;63:mh=38;5;99;1:or=48;5;197;38;5;228;1:ow=38;5;220;1:sg=48;5;234;38;5;100;1:su=38;5;9;1:so=38;5;197:st=38;5;86;48;5;234:tw=48;5;235;38;5;139;3:*LS_COLORS=48;5;89;38;5;197;1;3;4;7:*.BAT=38;5;108:*.exe=38;5;196:*.PL=38;5;160:*.asm=38;5;240;1:*.awk=38;5;148;1:*.bash=38;5;173:*.bat=38;5;108:*.c=38;5;110:*.cc=38;5;24;1:*.ii=38;5;24;1:*.cfg=1:*.cl=38;5;204;1:*.coffee=38;5;100;1:*.conf=38;5;221:*.C=38;5;24;1:*.cp=38;5;24;1:*.cpp=38;5;24;1:*.cxx=38;5;24;1:*.c++=38;5;24;1:*.ii=38;5;24;1:*.cs=38;5;74;1:*.css=38;5;91:*.csv=38;5;78:*.ctp=38;5;95:*.diff=48;5;197;38;5;232:*.enc=38;5;192;3:*.eps=38;5;33;1:*.etx=38;5;172:*.ex=38;5;148;1:*.example=38;5;225;1:*.git=38;5;197:*.gitignore=38;5;240:*.go=38;5;111:*.h=38;5;81:*.H=38;5;81:*.hpp=38;5;81:*.hxx=38;5;81:*.h++=38;5;81:*.tcc=38;5;81:*.f=38;5;81:*.for=38;5;81:*.ftn=38;5;81:*.s=38;5;81:*.S=38;5;81:*.sx=38;5;81:*.hi=38;5;240:*.hs=38;5;199;1:*.htm=38;5;125;1:*.html=38;5;9;1:*.info=38;5;101:*.ini=38;5;123:*.java=38;5;142;1:*.jhtm=38;5;125;1:*.js=38;5;42:*.jsm=38;5;42:*.jsm=38;5;42:*.json=38;5;213:*.jsp=38;5;45:*.lisp=38;5;204;1:*.log=38;5;190:*.lua=38;5;34;1:*.m=38;5;130;3:*.mht=38;5;129:*.mm=38;5;130;3:*.M=38;5;130;3:*.map=38;5;58;3:*.markdown=38;5;184:*.md=38;5;184:*.mf=38;5;220;3:*.mfasl=38;5;73:*.mi=38;5;124:*.mkd=38;5;184:*.mtx=38;5;36;3:*.nfo=38;5;220:*.o=38;5;240:*.pacnew=38;5;33:*.patch=48;5;197;38;5;232;1:*.pc=38;5;100:*.pfa=38;5;43:*.pgsql=38;5;222:*.php=38;5;99:*.pl=38;5;214:*.po=38;5;176:*.pot=38;5;206;1:*.plt=38;5;204;1:*.pm=38;5;197;1:*.pod=38;5;172;1:*.py=38;5;41:*.pyc=38;5;245:*.rb=38;5;192:*.rdf=38;5;144:*.rst=38;5;67:*.ru=38;5;142:*.scm=38;5;204;1:*.sed=38;5;130;1:*.sfv=38;5;197:*.sh=38;5;113:*.signature=38;5;206:*.sql=38;5;222:*.srt=38;5;116:*.sty=38;5;58:*.sug=38;5;44:*.t=38;5;28;1:*.tcl=38;5;64;1:*.tdy=38;5;214:*.tex=38;5;172:*.textile=38;5;106:*.tfm=38;5;64:*.tfnt=38;5;140:*.theme=38;5;109:*.txt=38;5;192:*.list=38;5;44:*.save=38;5;240:*.urlview=38;5;85:*.vim=38;5;14:*.vimrc=38;5;13:*.viminfo=38;5;240;1:*.xml=38;5;199:*.yml=38;5;208:*.zsh=38;5;173:*.bashrc=38;5;5:*README=38;5;220;1:*Makefile=38;5;196:*MANIFEST=38;5;243:*pm_to_blib=38;5;240:*.1=38;5;240;1:*.2=38;5;220;1:*.3=38;5;196;1:*.7=38;5;196;1:*.1p=38;5;160:*.3p=38;5;160:*.am=38;5;242:*.in=38;5;242:*.old=38;5;242:*.out=38;5;44;1:*.bmp=38;5;33:*.cdr=38;5;33:*.gif=38;5;33:*.ico=38;5;33:*.jpeg=38;5;33:*.jpg=38;5;33:*.JPG=38;5;33:*.png=38;5;33:*.svg=38;5;33;1:*.xpm=38;5;33:*.32x=38;5;137:*.A64=38;5;82:*.a00=38;5;11:*.a52=38;5;112:*.a64=38;5;82:*.a78=38;5;112:*.adf=38;5;35:*.atr=38;5;213:*.cdi=38;5;124:*.fm2=38;5;35:*.gb=38;5;203:*.gba=38;5;205:*.gbc=38;5;204:*.gel=38;5;83:*.gg=38;5;138:*.ggl=38;5;83:*.j64=38;5;102:*.nds=38;5;199:*.nes=38;5;160:*.rom=38;5;59;1:*.sav=38;5;220:*.sms=38;5;33:*.st=38;5;208;1:*.iso=38;5;9;1:*.nrg=38;5;124:*.qcow=38;5;141:*.VOB=38;5;99:*.IFO=38;5;99:*.BUP=38;5;99:*.MOV=38;5;99:*.3gp=38;5;99:*.3g2=38;5;99:*.asf=38;5;99:*.avi=38;5;99:*.divx=38;5;99:*.f4v=38;5;99:*.flv=38;5;99:*.m2v=38;5;99:*.mkv=38;5;99:*.mov=38;5;99:*.mp4=38;5;99:*.mpg=38;5;99:*.mpeg=38;5;99:*.ogm=38;5;99:*.ogv=38;5;99:*.rmvb=38;5;99:*.sample=38;5;99;1:*.ts=38;5;99:*.vob=38;5;99:*.webm=38;5;99:*.wmv=38;5;99:*.S3M=38;5;69;1:*.aac=38;5;69:*.cue=38;5;69:*.dat=38;5;69:*.dts=38;5;69;1:*.fcm=38;5;69:*.flac=38;5;69;1:*.m3u=38;5;69:*.m3u8=38;5;69:*.m4=38;5;69;3:*.m4a=38;5;69;1:*.mid=38;5;69:*.midi=38;5;69:*.mod=38;5;69:*.mp3=38;5;69:*.oga=38;5;69:*.ogg=38;5;69:*.s3m=38;5;69;1:*.sid=38;5;69;1:*.spl=38;5;69:*.wv=38;5;69:*.wvc=38;5;69:*.ape=38;5;69:*.afm=38;5;58:*.pfb=38;5;58:*.pfm=38;5;58:*.ttf=38;5;66:*.ttc=38;5;66:*.pcf=38;5;65:*.psf=38;5;64:*.bak=38;5;222;1:*.bin=38;5;228:*.pid=38;5;228:*.state=38;5;228:*.swo=38;5;228:*.swp=38;5;228:*.tmp=38;5;228:*.un~=38;5;228:*.zcompdump=38;5;228:*.zwc=38;5;228:*.db=38;5;147:*.dump=38;5;147:*.sqlite=38;5;147:*.typelib=38;5;147:*.7z=38;5;140:*.a=38;5;220:*.apk=38;5;148;3:*.arj=38;5;220:*.bz2=38;5;220:*.deb=38;5;215;1:*.ipk=38;5;220:*.jad=38;5;220:*.jar=38;5;220:*.nth=38;5;220:*.sis=38;5;220:*.part=38;5;220;1:*.r00=38;5;220:*.r01=38;5;220:*.r02=38;5;220:*.r03=38;5;220:*.r04=38;5;220:*.r05=38;5;220:*.r06=38;5;220:*.r07=38;5;220:*.r08=38;5;220:*.r09=38;5;220:*.r10=38;5;220:*.r100=38;5;220:*.r101=38;5;220:*.r102=38;5;220:*.r103=38;5;220:*.r104=38;5;220:*.r105=38;5;220:*.r106=38;5;220:*.r107=38;5;220:*.r108=38;5;220:*.r109=38;5;220:*.r11=38;5;220:*.r110=38;5;220:*.r111=38;5;220:*.r112=38;5;220:*.r113=38;5;220:*.r114=38;5;220:*.r115=38;5;220:*.r116=38;5;220:*.r12=38;5;220:*.r13=38;5;220:*.r14=38;5;220:*.r15=38;5;220:*.r16=38;5;220:*.r17=38;5;220:*.r18=38;5;220:*.r19=38;5;220:*.r20=38;5;220:*.r21=38;5;220:*.r22=38;5;220:*.r25=38;5;220:*.r26=38;5;220:*.r27=38;5;220:*.r28=38;5;220:*.r29=38;5;220:*.r30=38;5;220:*.r31=38;5;220:*.r32=38;5;220:*.r33=38;5;220:*.r34=38;5;220:*.r35=38;5;220:*.r36=38;5;220:*.r37=38;5;220:*.r38=38;5;220:*.r39=38;5;220:*.r40=38;5;220:*.r41=38;5;220:*.r42=38;5;220:*.r43=38;5;220:*.r44=38;5;220:*.r45=38;5;220:*.r46=38;5;220:*.r47=38;5;220:*.r48=38;5;220:*.r49=38;5;220:*.r50=38;5;220:*.r51=38;5;220:*.r52=38;5;220:*.r53=38;5;220:*.r54=38;5;220:*.r99=38;5;220:*.r56=38;5;220:*.r69=38;5;220:*.r58=38;5;220:*.r59=38;5;220:*.r60=38;5;220:*.r61=38;5;220:*.r62=38;5;220:*.r63=38;5;220:*.r64=38;5;220:*.r65=38;5;220:*.r66=38;5;220:*.r67=38;5;220:*.r68=38;5;220:*.r69=38;5;220:*.r69=38;5;220:*.r70=38;5;220:*.r71=38;5;220:*.r72=38;5;220:*.r73=38;5;220:*.r74=38;5;220:*.r75=38;5;220:*.r76=38;5;220:*.r77=38;5;220:*.r78=38;5;220:*.r79=38;5;220:*.r80=38;5;220:*.r81=38;5;220:*.r82=38;5;220:*.r83=38;5;220:*.r84=38;5;220:*.r85=38;5;220:*.r86=38;5;220:*.r87=38;5;220:*.r88=38;5;220:*.r89=38;5;220:*.r90=38;5;220:*.r91=38;5;220:*.r92=38;5;220:*.r99=38;5;220:*.r94=38;5;220:*.r95=38;5;220:*.r96=38;5;220:*.r97=38;5;220:*.r98=38;5;220:*.r99=38;5;220:*.rar=38;5;217;1:*.tar=38;5;222:*.tar.gz=38;5;216:*.tgz=38;5;214;1:*.gz=38;5;224:*.xz=38;5;182:*.zip=38;5;208:*.doc=38;5;190:*.wps=38;5;190:*.docx=38;5;190:*.xls=38;5;190:*.xlsx=38;5;190:*.ppt=38;5;190:*.pptx=38;5;190:*.pdf=38;5;190:*.djvu=38;5;190:*.cbr=38;5;190:*.cbz=38;5;190:*.chm=38;5;190:*.odt=38;5;112:*.ods=38;5;112:*.odp=38;5;112:*.odb=38;5;112:*.allow=38;5;112:*.deny=38;5;203:*.SKIP=38;5;244:*.def=38;5;136:*.directory=38;5;69:*.err=38;5;160;1:*.error=38;5;160;1:*.pi=38;5;126:*.properties=38;5;197;1:*.torrent=38;5;105:*.gp3=38;5;114:*.gp4=38;5;115:*.tg=38;5;99:*.pcap=38;5;29:*.cap=38;5;29:*.dmp=38;5;29:*.service=38;5;81:*@.service=38;5;45:*.socket=38;5;75:*.device=38;5;24:*.mount=38;5;115:*.automount=38;5;114:*.swap=38;5;113:*.target=38;5;73:*.path=38;5;116:*.timer=38;5;111:*.snapshot=38;5;139:*.desktop=38;5;113:*.crdownload=38;5;38:*.crx=38;5;13:
SHLVL=1
QT_IM_MODULE=fcitx
JAVA_HOME=/home/wgy/software/java/jdk1.8.0_201
TERM=xterm-256color
LANG=zh_CN.UTF-8
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_ID=2
XDG_SESSION_TYPE=x11
DISPLAY=:0
_=/home/wgy/software/clion-2018.3.3/bin/clion.sh
XDG_GREETER_DATA_DIR=/var/lib/lightdm/data/wgy
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
DESKTOP_SESSION=deepin
USER=wgy
CLASSPATH=/home/wgy/software/clion-2018.3.3/lib/bootstrap.jar:/home/wgy/software/clion-2018.3.3/lib/extensions.jar:/home/wgy/software/clion-2018.3.3/lib/util.jar:/home/wgy/software/clion-2018.3.3/lib/jdom.jar:/home/wgy/software/clion-2018.3.3/lib/log4j.jar:/home/wgy/software/clion-2018.3.3/lib/trove4j.jar:/home/wgy/software/clion-2018.3.3/lib/jna.jar
GIO_LAUNCHED_DESKTOP_FILE_PID=10253
VTE_VERSION=5201
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
XDG_SEAT=seat0
NO_AT_BRIDGE=1
XDG_VTNR=1
XDG_RUNTIME_DIR=/run/user/1000
HOME=/home/wgy
SPRING_PATH=/home/wgy/software/spring-2.2.0.BUILD-SNAPSHOT/bin

 

 

七:静态库和共享库

静态库是早期Unix系统中唯一的目标库,金泰库是对已编译目标模块的一种结构化整合.要使用静态库,需要在编译程序的链接命令中指定相应的库.链接器会将目标模块的副本复制到最终的可执行文件末尾,设想,如果有许多程序都拷贝这么一个副本,那么磁盘中就有许多相同的副本,这是对磁盘空间的浪费.同理,每个程序所调用的函数都有一份副本驻留在内存中,这又是对内存的浪费.

共享库解决了上述问题,将程序链接到共享库,知识在可执行文件中写入一条记录,以表明可执行文件在运行是需要使用该共享库.在运行时,"动态链接器"会确保可执行文件所需的动态库被找到.

八:进程见通信及同步

刚刚说了Linux是多任务抢占式系统,Linux系统上同时可运行多个进程,但进程之间是独立的,为了实现某些功能,又必须实现进程之间的通信,一种办法是读取磁盘文件中的信息,但这种方法既慢又缺乏灵活性.所以Linux提供了丰富的进程见通信(IPC)机制:

  • 信号(signal),用来表示事件的发生
  • 管道和FIFO,用于在进程间传递数据
  • 套接字,提供同一台主机或是联网的不同主机上所运行的进程之间传递数据
  • 文件锁定:为防止其他进程读取或更新文件内容,允许某进程对文件的部分区域加以锁定.
  • 消息队列,用于在进程间交换消息
  • 信号量(semaphore),用来同步进程的动作
  • 共享内存,允许两个及以上进程共享同一块内存.

 

九:线程-轻量级进程

在Linux中,每个进程都可以执行多个线程,线程共享同一虚拟内存及其他属性,共享同一数据区域和堆(这样,创建线程时,就不需要消耗时间拷贝内存).每个线程拥有属于自己的栈.

 

 

你可能感兴趣的:(linux,Linux,Linux编程,C语言,进程,内核)