03 2023 档案
摘要:变量访问的两种方式(取值): 1.通过变量名 2.通过变量的地址(指针) int *p;//指针变量p指向一个int类型的地址 指针变量和数组的区别(int *p、int arr[3]): 1. 指针变量指向的地址是可以变的(即p可以指向不同的整型地址),所以p++是可以的; 而数组名是一个常量(即
阅读全文
摘要://reader_writer.c //reader_writer.c #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <unistd.h> #include <error.h> #include <
阅读全文
摘要://account.h #ifndef _ACCOUNT_H #define _ACCOUNT_H typedef struct{ int code; double balance; //定义一把互斥锁,用来对多线程操作的银行账户(共享资源)进行加锁(保护)的 /* 建议一把互斥锁和一个共享资源(银
阅读全文
摘要://write.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> struct mymesg{ long mtype;//消息的类型,是一个整数且大于0 char mtex[51
阅读全文
摘要:信号递达:信号的处理动作(绑定的处理函数)。 信号的未决状态:信号从产生到递达之间的状态。 某个信号处于未决状态,一般是因为信号被阻塞(即信号屏蔽字对应的位被置1)了,即当捕获到这个信号时,由于信号处于未决状态,将不会执行信号的处理动作。 int sigemptyset(sigset_t *set)
阅读全文
摘要:同步: //account.h #ifndef _ACCOUNT_H #define _ACCOUNT_H #include <pthread.h> #include <semaphore.h> typedef struct{ int code; double balance; //定义一把互斥锁,
阅读全文
摘要://reader_writer.c #include <pthread.h> #include <stdio.h> #include <unistd.h> /* 写者写完通知读者去读 读者读完通知写者去写 */ typedef struct{ int value; int r_wait; pthre
阅读全文
摘要://account.h #ifndef _ACCOUNT_H #define _ACCOUNT_H #include <pthread.h> typedef struct{ int code; double balance; //定义一把互斥锁,用来对多线程操作的银行账户(共享资源)进行加锁(保护)
阅读全文
摘要://account.h #ifndef _ACCOUNT_H #define _ACCOUNT_H #include <pthread.h> typedef struct{ int code; double balance; //定义一把互斥锁,用来对多线程操作的银行账户(共享资源)进行加锁(保护)
阅读全文
摘要:CPU对变量的计算分为三个步骤: 1. 从内存读取变量到寄存器(如add寄存器) 2. 将读取到的变量进行计算 3. 将寄存器中计算的值写入内存 如有两个线程(线程1和线程2)对共享资源(全局变量)a=0进行自增操作(a++),可能出现如下情况: 线程1进行a++时,会将变量a读取寄存器,在对变量a
阅读全文
摘要:原型: int select(int max fdp1, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) 功能: 委托内核检查描述符集是否准备好(即可以使用,用于双方通信) 参数: fdp1
阅读全文
摘要:fcnt_vector_fd.h #ifndef _FCNTL_VECTOR_FD_H #define _FCNTL_VECTOR_FD_H typedef struct{ int *fd; int conter; int max_conter; }VectorFd; extern VectorFd
阅读全文
摘要://udp_server.c#include <signal.h>#include <stdio.h>#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <time.h>#include <string.h>#includ
阅读全文
摘要:tcp_server_mulpthread.c #include <signal.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <
阅读全文
摘要:tcp_server_mulprocess.c #include <signal.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <
阅读全文
摘要:方式: 1. 多进程模型 2. 多线程模型 3. IO多路转换 1. 多进程模型: 父进程循环调用accept来接受客服端的连接,当有客户端连接上来时,就调用fork函数创建子进程来与客户端对接。 如果不创建子进程,那么父进程调用read函数就可能阻塞,就不能实现并发性的处理了。 2. 多线程模型:
阅读全文
摘要:tcp_server.c #include <signal.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #include <string.h> #
阅读全文
摘要:客户端服务端编程模型: 服务器调用序列 客户端调用序列 1. 调用socket函数创建套接字 1. 调用socket函数创建套接字 2. 调用bind函数绑定本地地址和端口 2. 调用connect函数连接服务器 3. 调用listen函数启动监听 3. 调用read/write函数与服务器通信 4
阅读全文
摘要:socket是一种通讯机制,它给应用程序提供了使用如TCP/UDP的网络协议的方式; linux中的网络编程是通过socket接口实现的,socket是一种特殊的IO,提供对应的文件描述符。 一个完整的socket包括: 协议、本地地址、本地端口、远端地址、远端端口; 字节序: 不同体系结构的主机使
阅读全文
摘要:什么是协议? 即通信双方共同遵守的约定、规则。一方按照这种规则发送,另一方必须按照这种规则解析,这样数据才不会发生错乱,传输的数据才会正确 网络的分层: TCP/IP协议族大体上分为三部分: 1. 网络协议(IP协议,网络层) 2. 传输协议(TCP/UDP协议,传输层) 3. 应用协议(FTP协议
阅读全文
摘要:普通数组: int arr[5];//数组arr中存放了5个整型数 int int int int int arr[0] arr[1] arr[2] arr[3] arr[4] 指针数组:是一个数组,里面存放的是指针 int *arr1[5];//表示是一个指针数组,里面存着5个整型指针 int *
阅读全文
摘要:可执行文件就是多个目标文件(.o文件)通过链接生成的 预处理(.i文件):宏替换、头文件的展开、条件编译(带#的处理)、去注释 编译(.s文件):语法检测,生成汇编代码 汇编(.o文件):将汇编代码生成二进制文件 链接:找调用函数的地址(一个目标文件中可能有多个函数,我们只有一个函数或几个),通过函
阅读全文
摘要:信号量本质上就是共享资源的数目,用来控制对共享资源的访问; 信号量可用于进程间的同步和互斥; 每种共享资源对应一个信号量,信号量集就是有很多信号量,便于大量共享资源的操作,信号量集中的所有操作可以要求全部成功,也可以部分成功; 二元信号量(信号灯)值为0和1; 对信号量的操作就是进行PV操作; 信号
阅读全文
摘要:共享内存是被多个进程共享的一部分物理内存; 写入共享内存后,数据不会消失,可以一直读取; 再次向共享内存中写入,会覆盖原来的数据,即每次写数据都是从相同的位置上写(从shmat函数返回的地址开始写) 多进程想要进程数据通信,就得把这块共享内存映射到自己的虚拟地址空间,其在虚拟地址空间的位置: 共享内
阅读全文
摘要:所有的字符窜都是以‘\0’结束的 sizeof和strlen sizeof()是一个关键字,表示的是操作数所占空间的大小; strlen()是一个函数(参数必须是char *的指针),表示的是字符窜的长度,strlen是通过判断遇到\0来判断字符窜结束 1. int arr1[] = {1,2,3,
阅读全文
摘要:System V IPC: Unix系统存在信号、管道等基本的进程间的通信机制; System V引入了三种高级的进程通信机制: 消息队列、共享内存、信号量 IPC对象(消息队列、共享内存、信号量)存在于内核中而不是文件系统中(虽然管道也是在内核中,但是它的释放由内核控制),由用户控制释放(即用户管
阅读全文
摘要:管道的实质:内核中的一块缓冲区 管道是单工的,数据只能从一个方向流向另外一个方向(单向);想要双向通信时,需要建立两个管道。 先写进管道中的数据先被读出。 无名管道: 用于有血缘关系的进程 int pipe(int fd[2]) 返回:成功返回0;失败:-1 因为pipe函数在fork之前调用,所以
阅读全文
摘要:六种通讯方式: 1. 无名管道和命名管道 2. 信号 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字 所有进程共享3~4G的内核空间,所以基于内核之间的通信能够实现(为了保证安全,每个进程的用户地址空间都是独立的,一般而言一个进程不能直接访问另一个进程的地址空间,不过内核空间是每个进程都
阅读全文

浙公网安备 33010602011771号