一.文件
1.文件的操作
(1)打开
fd= int open(const char *pathname, int flags(O_RDWR);
fd= int open(const char *pathname, int flags(O_RDWR|O_CREAT);
mode_t mode(权限)仅当创建新文件时才使用 (-rwx:可读可写可执行)
fd返回值为-1为失败
(2)读写
ssize_t read(int fd, void *buf2, size_t count);
(buf2需要malloc申请空间)
ssize_t write(int fd, const void *buf1, size_t count);
(char *buf1=“ldy” strlen(buf))
(3)光标
off_t lseek(int fd, off_t offset, int whence);
(偏移值 SEEK_SET ;SEEK_CUR;SEEK_END)
(4)其他参数
O_EXCL同时指定OCREAT,文件存在,则出错
O_APPEND每次写时加到文件的尾端(避免覆盖)
O_TRUNC文件原始内容全部清空再写入
二.进程
1.程序和进程
程序是静态的概念
进程是程序的一次运行活动
2.程序存储空间的分配
(1).正文:代码段(一些算法语句)
(2).初始化的数据:数据段赋值了的变量 (数据段)
(3).未初始化的数据:bss(初始化为0或者空指针) (bss段)
(4).堆:malloc的申请
(5).栈:调用函数要返回的地址以及未初始化的局部变量都保存在栈里面
(6).高地址:命令行参数环境变量
3.进程的操作
(1)创建
fork:pid_t fork(void);—返回值—>大于0(子进程pid)父进程—>等于0 子进程
vfork:1.直接使用父进程存储空间,不拷贝
2.保证子进程先运行,子进程结束后调用exit(0)退出后,父进程才运行 僵尸进程
(2)等待退出
wait(&status)等待子进程父进程阻塞
1.父进程等待子进程退出状态:正常进程
2.父进程没有等待子进程退出状态:僵尸进程
waitpid(pid,&status,WNOHANG)等待子进程父进程不阻塞 僵尸进程
孤儿进程:父进程在子进程没结束前就挂掉,剩下的子进程被init进程所收留
(3)exec族函数
exec(./bin/date,“date”,NULL,NULL)
(4)system函数
system(“date”)
三.线程
1.线程和进程的区别
一个进程在运行时候要给它分配内存,要维护数据段代码段堆栈等,线程会共享这些东西,开辟多个线程不会分配多的内存,是一个简洁的,多任务的操作方式。
2.线程的操作
pthread_self();//线程ID
ret=pthread_create(&t1,NULL,func1,(void )¶m); //创建线程
pthrea_join(t1,NULL);//等待线程
pthread_exit((void)p);//退出线程
多个线程维护的是同一段内存,共享一个数据段
3.互斥量
被锁住的东西称为共享资源
pthread_mutex_t mutex;//定义
pthread_mutex_init(&mutex,NULL);//初始化
pthread_mutex_destroy(&mutex);//销毁
pthread_mutex_lock(&mutex);//上锁
pthread_mutex_unlock(&mutex);//解锁
4.条件
pthread_cond_init(&mutex,NULL);//条件初始化
pthread_cond_destory(&cond);//条件销毁
pthread_cond_signal(&cond);//条件唤醒
pthread_cond_wait(&cond,&mutex);//条件等待
四.进程间的通信
1.管道
(1)管道(无名管道) 特点:半双工、只用于父子进程、不属于文件只存在于内存中
int pipe(int pipefd[2]); fd[1]:读 fd[0]:写
(2)FIFO(有名管道)
int mkfifo(const char *pathname, mode_t mode); //创建
2.消息队列
int msgget(key_t key, int msgflg); //创建
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); //发送
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg); //读取
key(索引)
key=ftok(“.”,“z”);
int msgctl(int msqid, IPC_RMID, NULL); //移除队列
3.共享内存
int shmget(key_t key, size_t size, IPC_CREAT|0666); //创建共享内存
void *shmat(int shmid, 0, 0); //共享内存映射
int shmdt(const void *shmaddr); //共享内存卸载
int shmctl(int shmid,IPC_RMID, 0); //共享内存删除
ipcs -m //查看共享内存
ipcrm -m //删除共享内存
4.信号
kill -l 查看所有的信号
kill(pid,signum);//发信号
sighandler_t signal(int signum, sighandler_t handler);//收信号
忽略: SIG_IGN
捕捉:信号处理函数—>void handler(int signum)
默认动作: kill -9 PID //结束进程
信号携带消息
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); //收信号
int sigqueue(pid_t pid, int sig, const union sigval value);//发信号
5.信号量
int semget(key_t key, int nsems, int semflg); //创建信号量
int semctl(int semid, int semnum, int cmd, …); //初始化信号量
int semop(int semid, struct sembuf *sops, unsigned nsops); //取锁,放锁
五.网络编程
1.先导
IP地址—端口号—数据协议
TCP:数据量准确
UDP:数据量大,可靠度没有那么高,内存响应快
Sockt套接字
小端字节序:将低序字节存储在起始位置
大端字节序:将高序字节存储在起始位置
网络字节序=大端字节序
2.服务器:
s_fd=int socket(AF_INET , SOCK_STREAM , 0);//创建通道
bind(s_fd , (struct sockadd *)&s_addr,sizeof(struct sockaddr_in));//绑定连接
listen(s_fd,10);//监听连接
int c_fd=accept(s_fd,(struct sockadd *)&c_addr,sizeof(struct sockaddr_in);//接受
3.客户端:
connect(c_fd,(struct sockadd *)&c_add,sizeof(struct sockaddr));
一.liunx库引用分文件编程
1.静态库
程序编译前就加入目标程序中(.a/.lib) 优缺点:运行快等
2.动态库
程序执行时临时由目标程序去调用(.so/.dll) 优缺点:运行慢等
静态库生成和使用/动态库生成和使用
二.交叉编译
宿主机—>PC
目标机—>单片机
软链接:类似于window的快捷方式,包含另一个文件的位置信息
硬链接:在选定的位置上生成一个和源文件大小相同的文件
三.linux内核配置
1.内核配置方式
(1).cp厂家.config .config (2).make menuconfig
2.驱动两种加载方式
(1).*编译进内核 zImage包含了驱动
(2).M模块方式生成驱动文件,通过命令inmosd xxx .ko加载驱动
四.文件系统
存储设备组织文件的方法(程序)
种类:FAT VFAT NTFS EXT TMPFS
文件系统分区:bootloader param kernel /(文件系统结构)
五.驱动
编译驱动程序:配置编译内核—放到板子上—编译测试
内核打印函数:printk
module_init()(整个驱动的入口)—>pin4_drv_int()(实际入口)(主设备号)<—>结构体加入链表(register_chrdev())—>次设备号—>设备名
列出驱动模块:lsmod
加载驱动:insmod pin4driver2.ko
删除驱动模块:rmmod pin4driver2.ko
加入权限:chmod 666 /dev/pin4
查看内核printk源码:dmesg
六.其他
总线地址:CPU能够访问内存的范围
物理地址:硬件的实际地址
虚拟地址:逻辑(软件层面)地址
DMA:直接访问内存单元,高度内存拷贝单元