Linux_网蜂ARM Cortex-A8学习笔记_Linux应用编程篇

第六部分:Linux应用编程篇

6.1.2 Linux应用编程需要学习什么

C语言和数据结构作为基础,重点学习链表。
学习的内容:
1)库函数的熟悉,比如 memcpy,memset,strstr,strcpy 等等
2)SHELL编程,现在很多游戏行业,必须熟悉 SHELL 编程
3)文件IO编程, 这个不用解释,哪都能用着
4)进程编程,比如进程间通信,也是到处可见
5)多线程编程,试想如果你的windows操作系统没有多线程,会是什么样的呢
6)网络编程, 网络公司一定要求你熟悉网络编程,想进腾讯就好好学这个吧
参考书籍《Linux程序设计第四版》和《UNIX高级环境编程》

6.2 文件IO编程

文件分为:普通文件、目录文件、链接文件和设备文件。
Linux环境下,所有设备和文件的操作都使用文件描述符来进行的。
不带缓存的文件IO程序设计是Linux文件操作程序设计的重点。(不能移植到非POSIX标准的系统)
文件底层 I/O 操作的系统调用主要用到 5 个函数: open()、 close()、 read()、 write()、 lseek()。

问题:
Linux下编程的执行顺序是怎么样的?
进程与线程的具体表现形式?
信号量的PV原语?

6.3 进程控制编程

进程标志:PID(子进程),PPID(父进程)
进程状态:执行态,就绪态,阻塞态
fork()函数创建进程,返回子进程的进程号
vfork()函数,不产生父进程的副本,“写操作时拷贝”技术(copy-on-write)
exec()函数族可以根据文件名或目录找到可执行文件,并用来取代原调用进程的数据段、代码段和堆栈段。
函数族列表
Linux_网蜂ARM Cortex-A8学习笔记_Linux应用编程篇_第1张图片
waitpid函数,使父进程阻塞,直到子进程结束退出或者子进程接到了一个指定的信号为止。

6.4 进程间通信

进程数据共享时进行。
进程间的通讯方式:管道,消息队列,共享内存,信号量,套接字。

管道:作用是把一个程序的输出直接连接到另一个程序的输入。
无名管道的特点:
1)只能用于具有亲缘关系的进程之间的通信,例如父子或者兄弟进程
2)半双工的通信模式,固定的读端口和写端口
3)可以看做是特殊的文件,只存在于内存中(带有p的文件就是管道文件)

pipe()函数,创建无名管道,fd[0]固定用于管道读端,fd[1]固定用于管道写端
close()函数,关闭管道,分别关闭各个文件描述符

有名管道可以使互不相关的两个进程实现彼此通信,有名管道又称FIFO(first In first Out),即先进先出
mkfifo()函数,创建有名管道

6.4.3共享内存
内核留出一块内存,可以由需要访问的进程将其映射到自己的私有地址空间,不同进程可以及时的看到某进程对共享内存的数据进行更新。
需要引进某种同步机制,如互斥锁和信号量。
共享内存分为两个步骤,一创建共享内存,shmget()函数,也就是从内存中获得一段共享内存区域。二映射共享内存,也就是把这段刚创建的共享内存映射到具体的进程空间去,shmat()函数。撤销映射,shmdt()函数。
ipcs命令:报告进程间通信机制状态,用于查看共享内存,消息队列等各种进程间通信机制的情况。

消息队列,由“队列ID”来标识

6.5 线程编程

当进程在进行切换操作时都需要进行上下文切换,从而造成很大的花销。为了减少处理机的空间时间,支持多处理器和减少上下文切换的开销,这样一来,线程就诞生了。
进程是系统中程序执行和资源分配的基本单位。相应地,线程是一个进程内的基本调度单位,也可以称为轻量级进程。
多线程系统中,线程和进程的关系:
Linux_网蜂ARM Cortex-A8学习笔记_Linux应用编程篇_第2张图片
pthread_create()函数:创建线程
pthread_exit()函数:退出线程
exit()函数:退出进程,进程结束后,进程中的所有进程都会因为进程的结束而结束
pthread_join()函数:挂起当前线程

线程的属性包括:绑定属性、分离属性、堆栈地址、堆栈大小、优先级。
其中系统默认的属性为非绑定、非分离、缺省1M大小的堆栈,与父进程同样级别的优先级。

属性设置的步骤:
初始化函数:pthread_attr_init()
设置绑定属性:pthread_attr_setscope()
设置分离属性:pthread_attr_setdetachstate()
设置优先级:pthread_attr_getscheparam()和pthread_attr_setchedparam()
创建线程:pthread_create()

资源的访问存在唯一性,简单的说,就是对资源的访问,每次只能有一个进程,这时就需要引入同步和互斥机制。在POSIX中线程同步的方法,主要有互斥锁(mutex)和信号量。
互斥锁的操作主要包括以下几个步骤: 
1.互斥锁初始化:pthread_mutex_init 
2.互斥锁上锁:pthread_mutex_lock 
3.互斥锁判断上锁:pthread_mutex_trylock 
4.互斥锁解锁:pthread_mutex_unlock 
5.消除互斥锁:pthread_mutex_destroy

信号量其实就是一个非负的整数计数器,是操作系统中所用的PV原语,它主要应用于进程或线程间的同步与互斥。

6.6 网络编程

TCP/IP协议包含了上百个功能的协议,如ICMP(互联网控制信息协议)、FTP(文件传输协议)、UDP(用户数据报协议)、ARP(地址解析协议)等。TCP负责发现传输的问题,一旦有问题就会发出重传的信号,直到所有数据安全正确地传输到目的地。而IP就是给因特网的每一台电脑规定一个地址。

IP地址,端口,域名

套接字(socket),在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。
套接字类型:流式socket(TCP)、数据报socket(UDP)和原始socket(IP或ICMP)。
套接字(也叫套接口)由三个参数构成:IP地址,端口号和传输层协议。
常用的数据结构sockaddr和sockaddr_in,一般使用sockaddr_in这种形式。
sa_family(地址族)常见值如下:
AF_INET:IPv4 协议 
AF_INET6:IPv6 协议 
AF_LOCAL:UNIX域协议

主机名与IP地址间的转换
数据存储大小端的问题

6.6.2 网络基础编程
主要介绍TCP和UDP协议
TCP
TCP管理到其他socket的数据传递,可以说,通过IP源/目的可以唯一的区分网络中两个设备的关联,区分网络中两个应用程序的关联。TCP三次握手的过程:
1)初始化主机通过一个同步标志置位的数据段发出会话请求;
2)接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发生的数据段的起始字节的顺序号、应答并带有将受到的下一个数据段的字节顺序号。
3)请求主机再回送一个数据段,并带有确认顺序号和确认号。
TCP协议编程相关函数:
socket(), bind(), connect(), listen(), accept(), close(), send(), recv()。

UDP
UDP 即用户数据报协议,它是一种无连接协议,因此不需要像 TCP 那样通过三次握手来建立一个连接。
UDP协议编程相关函数:
bind(), close(), sendto(), recvfrom()。

你可能感兴趣的:(Linux,编程,Linux,应用,编程)