LINUX知识整理,linux知识


Socket():创建套接字

Bind():绑定套接字。将一个本地协议地址赋予一个套接字

Listen():监听套接字

Connect():建立与服务器之间的连接。

accept():接收连接,

Send():发送函数

recv():接收函数

close():关闭连接

服务器端顺序:

Socket(),bind(),listen(),accept(),recv(),close()

客户端顺序:

Socket(),connect(),send(),close()

 


 

socket():创建套接字,返回一个小整数描述符,以后所有的函数调用就用该描述符来标识这个套接字。  返回值小于0则创建套接字失败   AF_XX地址族  PF_XX协议族

socket( int af, int type, int protocol);

af: 一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。

type: 指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM)UDP(SOCK_DGRAM)。常用的socket类型   有,SOCK_STREAMSOCK_DGRAMSOCK_RAWSOCK_PACKETSOCK_SEQPACKET等等。

protocol: 顾名思义,就是指定协议。套接口所用的协议。如调用者不想指定,可用0。常用的协议有IPPROTO_TCPIPPROTO_UDPIPPROTO_SCTPIPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。


 

inet_pton():IP地址转换函数,可以在将IP地址在"点分十进制""二进制整数"之间转换

而且,inet_ptoninet_ntop2个函数能够处理ipv4ipv6

int inet_pton(int af,const char*src,void*dst);

这个函数转换字符串到网络地址,第一个参数af是地址族,第二个参数*src是来源地址,第三个参数*dst接收转换后的数据。

inet_ptoninet_addr的扩展,支持的多地址族有下列:

af=AF_INET

src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址转换为in_addr的结构体,并复制在*dst中。

af=AF_INET6

src为指向IPV6的地址,函数将该地址转换为in6_addr的结构体,并复制在*dst中。

如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0


fork():   pid_t fork(void);  在子进程中返回0,在父进程中返回子进程的ID,若出错返回-1

Fork在子进程返回0而不是父进程的ID原因是:任何子进程都只有一个父进程,且子进程可以通过调用getppid取得父进程的进程ID。相反,父进程可以有许多子进程,而且无法获取各个子进程的ID号,如果父进程想要跟踪所有子进程的进程ID,那么它必须记录每次调用fork的返回值。

会创建一个父进程的副本,两者同时运行,先后顺序不确定

vfork():

1.vfork保证子进程先运行,在它调用execexit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用execexit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。

为什么会有vfork?

因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,然后将会有两种行为:

1.执行从父进程那里拷贝过来的代码段

2.调用一个exec执行一个新的代码段

当进程调用exec函数时,一个新程序替换了当前进程的正文,数据,堆和栈段。这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vforkvfork并不复制父进程的进程环境,子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子霸占着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。

因此,如果创建子进程是为了调用exec执行一个新的程序的时候,就应该使用vfork


 

线程:一个程序至少有一个进程,一个进程至少有一个线程。

线程是进程的一个实体,是CPU进行调度的最小单位。

几个函数:

pthread_mutex_lock(&mutex);          //加锁
pthread_mutex_unlock(&mutex);          //释放锁
pthread_cond_wait(&cond, &mutex);    //条件等待  进入此语句将加锁进行释放
pthread_cond_signal(&cond);          //激活条件
pthread_cond_broadcast(&cond);       //   广播    激活所有满足此条件的
pthread_create(&tid[i-1], NULL, thread_fun, &i);   //创建线程
pthread_join(tid[i], NULL);           //等待线程结束

 

线程的同步与互斥

多线程共享一个进程的地址空间虽然线程间通信容易进行,但是多线程同时访问共享对象时需要引入同步和互斥机制。
同步指的是多个任务按照约定的顺序相互配合完成一件事情,dijkstra基于信号量的概念提出了一种同步机制。由信号量决定线程是继续运行还是阻塞等待。

线程间的互斥,引入互斥锁的目的是用来保证共享资源数据操作的完整性
互斥锁主要用来保护临界资源
每个邻居资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。

线程必须先获得互斥锁才能访问临界资源,访问完临界资源后释放该锁。如果无法获得锁,线程会阻塞知道获得锁为止。

互斥锁和条件变量实现读写锁:读写锁的读和写是互斥的,读的时候不能写,写的时候不能读,但如果实现读写锁的话,首先要确定的的是读优先还是写优先。还有就是读进程可以共存,写进程则完全互斥。如果有进程需要写时,要申请写锁,但如果在申请写锁的时候发现有其他进程正在写或者正在读,则进行等待,一直等到读锁或写锁完全释放为止。读进程在读取时先申请读锁,若此时有写进程,则进行等待,一直等到写锁释放后在进行读。

 


 

OSI七层模型:

7:应用层

6:表示层

5:会话层       

4:传输层

3:网络层       

2:数据链路层

1:物理层

网际网协议族:

应用层      OSI567

TCP |UDP    OSI4    网络层可直接绕或传输层直接使用IPV4IPV6

IPV4IPV6   OSI3

设备驱动程序和硬件   OSI12


 UDP:简单的、不可靠的数据报协议。非连接的协议,传输数据之前源端和终端不建立连接,当它想传据的速度仅仅是受送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

TCP:复杂的可靠地字节流协议。是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。三次握手四次挥手

三次握手

1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

2)第二次握手:服务器B收到SYN包,必须确认客户ASYNACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

3)第三次握手:客户端A收到服务器BSYNACK包,向服务器B发送确认包ACKACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

四次挥手

1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 

2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 

3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A 

4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1 

TCPUDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

SCTP:流控制传输协议,可靠地

 


 

进程间的几种通信方式:

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe)  有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号 ( sinal ) 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 信号量( semophore ) 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
# 套接字( socket )  套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

 


 

LINUX基本命令:

ls 显示文件 -l 详细信息

-a 所有文件,包括隐藏

mkdir 创建目录

cd 切换目录

touch 创建空文件

echo 创建带有内容的文件

cat 查看文件内容

cp 拷贝 (源文件 目的文件)

mv 移动或重命名

rm 删除文件

-r 可删除子目录及文件

-f 强制删除

rmdir 删除空目录

find 在文件系统搜索某文件

wc 统计文本中行数、字数、字符数

grep 在文本文件中查找某字符串

pwd 显示当前目录

ln 创建链接文件

系统管理命令

stat 显示指定文件的详细信息 比ls更详细

ps 显示瞬间进程状态

ifconfig 查看网络情况

ping 测试网络联通

clear 清屏

kill 杀死进程

chown 更改所有者或用户组

chmod 更改文件权限 读写执行

 

相关内容