针对Linux的个人总结

本文详细介绍了Linux系统中的文件操作,进程概念及管理,包括创建、等待退出等;深入讲解了进程间通信的各种方式如管道、消息队列、共享内存、信号量等;还涉及到了网络编程基础和内核配置。此外,文章提到了库文件的静态与动态编译,交叉编译原理,以及驱动程序的开发与加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.文件

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 )&param); //创建线程
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:直接访问内存单元,高度内存拷贝单元

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值