目录
1.socket 创建套接字(可以理解为网络的一个通道或者函数接口)
2.bind绑定套接字和服务地址
3.listen 监听套接字
4.accept等待客户端连接
5.recv 接收数据,成功返回数据的实际长度,失败返回-1。
6. connect客户端连接服务器
7.write(与read参数一致)
8.signal信号
9.sprintf:将多个不同类型的数据存放在一个字符串里面
10.fscanf和scanf的区别:fscanf是从文件中读取数据,scanf是从屏幕上读取数据
1.open:打开或新建一个文件
2.close:关闭一个已经打开的文件
3.lseek 定位一个已经打开的文件
进程
1.线程的创建
2.线程的终止:
1.socket 创建套接字(可以理解为网络的一个通道或者函数接口)
int socket(int domain, int type, int protocol);
man 手册:man socket
参数:domain:AF_INET(ipv4的地址族)
type:SOCK_STREAM(流式套接字):tcp传输层协议(面向连接,数据顺序发送,一对一的可靠通信)
SOCK_DGRAM(报式套接字):udp传输层协议(无连接的通信,数据是打包成数据包发送的,不一定按顺序到达,效率很高)
protocol:0(type类型对应的默认协议)
返回值:
成功则返回流式套接字(特殊的文件描述符)sockfd 0~1023
失败则返回-1。
2.bind绑定套接字和服务地址
bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:sockfd(socket函数的返回值):流式套接字
sockaddr:服务器结构体的地址
addrlen:服务器结构体的长度
返回值:
成功则返回0
失败则返回-1。
3.listen 监听套接字
int listen(int sockfd,int backlog);
功能:设置套接字
参数:
sockfd:socket函数的返回值:流式套接字
backlog:最大同时等待队列长度(队列:先进先出),也就是最多同时连接服务器的客户端个数
返回值:
成功返回0;
失败返回-1。
注意:经过listen函数后,流式套接字会变成监听套接字
4.accept等待客户端连接
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
man 手册参考:man accept
功能:等待客户端连接
参数:
sockfd:监听套接字
addr:客户端的结构体地址
addrlen:客户端结构体地址的长度
返回值:
成功返回新的套接字;
失败返回-1。
5.recv 接收数据,成功返回数据的实际长度,失败返回-1。
recv(int sockfd,void *buf,size_t len,int flags);(send,把消息发给客户端,参数与其一致,只是flags代表send的标识符)
参数:
flags:recv的标识符,默认为0
6. connect客户端连接服务器
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
const struct sockaddr *addr 客户端的结构体地址
socklen_t addrlen客户端结构体地址的长度
返回值:
成功返回 0, 失败返回 -1
7.write(与read参数一致)
函数原型: ssize_t write(int fd, const void *buf, size_t count);
函数功能: 向一个已经打开的可写文件中写入数据
参数: fd -- 文件描述符
buf -- 指定的缓冲区,指向一段内存单元
count -- 请求写入的字节数
返回值:
成功返回写入的字节数,失败返回-1,通过errno设置错误码;
write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件;
8.signal信号
signal(SIGINT,sig_close)
参数:
SIGINT:来自键盘的中断信号 ( ctrl + c )
9.sprintf:将多个不同类型的数据存放在一个字符串里面
10.fscanf和scanf的区别:fscanf是从文件中读取数据,scanf是从屏幕上读取数据
1.open:打开或新建一个文件
1.open:打开或新建一个文件
int open(char *pathname,int flags,mode_t mode);
参数:
pathname ----被打开的文件名( 可包含路径,没加文件路径表示在当前目录)
flags ----O_RDONLY:只读方式打开
----O_RDWR:读写方式打开 //前三个参数必须选择一个进行填写
----O_CREAT:如果该文件不存在,就新创建一个文件,并用第三个参数为其设置权限
----O_EXCL: 如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在
//O_NOCTTY: 使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
O_TRUNC: 如文件已经存在, 那么打开文件时先删除文件中原有数据
O_APPEND: 以添加方式打开文件,所以对文件的写操作都在文件的末尾进行
mode -- 被打开文件的存取权限
0标识这个数是8进制
三个8进制数 1、文件拥有者读写权限 2、拥有着同组用户读写权限 3、其他用户读写权限
返回值:
调用成功返回文件描述符,失败返回-1并设置errno;// perror("open");
2.close:关闭一个已经打开的文件
int close(int fildes);
参数:fildes -- 要关闭文件的文件描述符
返回值:
成功返回0,出错返回-1,并设置errno;
当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁;
3.lseek 定位一个已经打开的文件
off_t lseek(int fd, off_t offset, int whence);
参数:
fd -- 文件描述符
offset -- 偏移量,每一读写操作所需要移动的距离, 单位是字节的数量,可正可负(向前移,向后移)
whence(当前位置基点) -- SEEK_SET:当前位置为文件的开头,新的位置为偏移量的大小。
SEEK_CUR:当前位置为文件指针的位置, 新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
返回值:
调用成功时,返回当前相对与文件开头的偏移量,以字节为单位
调用失败时返回-1,并修改errno的值;
进程
进程的通信:管道/匿名管道、有名管道、共享内存、套接字、消息队列、信号量
同步:信号量;异步:互斥锁
注意:所有程序并不是同时运行的,CPU会分布时间片,进程是在CPU的调度下进行的,每个进程都分配4G虚拟内存空间。
pid_t pid; //进程号
pid_t fork(void) //功能:创建一个进程
成功:返回0,失败:-1;父进程1
fork()创建子进程 ps -ajx:查看进程状态 子进程先于父进程结束后,子进程会变成僵尸进程,需要父进程给儿子收尸。 #include#include pid_t wait(int *status); eg:wait(NULL); pid_t waitpid(pid_t pid,int *status,int options); eg: waitpid(-1,NULL,0); //阻塞---wait(NULL); waitpid(-1,NULL,WNOHANG);//非阻塞状态 注意:父进程先于子进程结束后,子进程会变成孤儿进程,被init进程收养。
1.线程的创建
int pthread_create(pthread_t *thread,const pthread_arr_t *attr,
void *(*start_routine) (void *), void *arg);
参数:
//第一个:pthread_t 类型的指针,需要给你回填一个线程标识,所以需要一个pthread_t 类型变量的地址,然后把线程标识给你进行回填;
//第二个:加const,说明只读不写, 指定pthread_arr_t *attr指针线程的属性,80%的时候写NULL,意为不进行线程标识的指定。
//第三个:void *(*start_routine) (void *)通过第四个参数void *arg传过去,用(void *)是最好用的,因为不知道你要返回什么类型
2.线程的终止:
3种方式:
(1)进程退出,线程从启动例程返回,返回值就是线程的退出码
(2)线程调用函数pthread_exit()函数
(3)被动退出:pthread_cancel(),线程被同一进程中的线程取消,线程结束后可以通过pthread_join()



