- 博客(58)
- 收藏
- 关注
原创 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
树莓派高级开发之相关io口的驱动代码的编写,与及BCM2835芯片手册的导读
2022-09-21 16:09:07
2084
原创 配置适合树莓派的linux内核(对内核的配置,编译,并将编译好的内核挂载到树莓派上)(面试)(在linux文件系统认知之前)
树莓派的linux内核配置
2022-08-03 13:39:00
643
原创 Linux系统编程项目之ftp云盘
一、首先介绍一下这个项目要实现的功能在客户端对服务端的操作:1.获取服务器的文件(get)2.查看服务器的所有文件(ls)3.进入服务器的某个文件夹(cd)4.上传文件到服务器(put)5.查看服务器当前在那个文件夹(pwd)6.退出 (quit)在客户端本地的功能实现:1.查看客户端本地有哪些文件(lls)2.进入客户端的某个文件夹(lcd)3.查看客户端当前在那个文件夹下(lpwd)4.退出连接(quit)二、介绍一下项目开发的思路服务端:(1)先建立socket通道(2
2022-05-31 15:21:29
492
原创 Linux系统编程之网络编程(socket)
一、socket网络编程首先简单介绍一下UNIX/Linux下的socket:在UNIX、Linux系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。你也许听过很多高手说过,UNIX/LLinux中的一切皆文件,那个家伙说的没错。为了表示和区分已经打开的文件,UNIX/Linux会为每个文件分配一个ID,这个文件就是一个整数,被称为文件描述符(File Descriptor),例如:通常用 0 来表示标准输入文件(stdi
2022-05-25 21:22:01
2303
原创 Linux系统编程之线程(多线程编程初探)
在讲线程之前,我们先来看看线程与进程之间的关系:进程与线程:典型的UNIX/linux进程可以看成是只有一个控制线程,一个进程在同一时刻只做一件事情,有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。线程是操作系统能够进
2022-05-19 17:07:01
510
原创 Linux系统编程之进程间的通信(信号量)
前言:信号量的相关概念:信号量:主要用于同步与互斥。为了防止出现因多个进程访问临界资源而引发的一系列问题,信号量可以提供这样一种访问机制,在任一时刻只能有一个执行线程访问代码的临界区域,也就是说信号量是用来协调进程对临界资源的访问。信号量的操作:信号量是一种特殊的变量,对信号量的访问必须是原子操作,信号量的操作只有两种:P操作(-1,申请资源)和V操作(+1,释放资源)。最简单的信号量只有两种取值0和1,称这样的信号量为二元信号量。可以取值为正整数N的信号量称为多元信号量,它允许多个线程并发的访问资源
2022-05-16 21:01:47
751
原创 Linux系统编程之进程间通信(信号)
信号(signal):信号的基本概念:信号是事件发生时对进程的通知机制,有时也叫软件中断,信号可以让一个正运行进程被另一个运行进程异步进程中断,转而处理某突发事件。注意:信号的产生和处理都是由内核完成简单说一下使内核为进程产生信号的事件有:1 终端发特殊字符,如CTRL+C 对前台进程发送中断信号2 硬件发生异常,如被0除等异常机器语言指令。3 系统状态变化:如alarm定时器到期引起SIGALRM信号,进程某个子进程退出4 运行kill 命令/函数。信号使用的目的:...
2022-05-16 16:44:41
321
原创 Linux系统编程之进程间通信(共享内存)
前言:首先说一下共享内存实现进程间通信的基本原理,共享内存实际是操作系统在实际物理内存中开辟的一段内存。共享内存实现进程间通信,是操作系统在实际物理内存开辟一块空间,一个进程在自己的页表中,将该空间和进程地址空间上的共享区的一块地址空间形成映射关系。另外一进程在页表上,将同一块物理空间和该进程地址空间上的共享区的一块地址空间形成映射关系。看上图,一个进程往该共享内存空间写入内容时,另一个进程也可以访问到这个共享内存空间,读取到一个进程写入的内容,相反也可,这就实现了两个进程间的通信。要实现进程间通信需
2022-05-12 21:57:08
434
原创 Linux系统编程之进程间的通信(消息队列)
一、消息队列(1) 消息队列是进程间通信的一种方式,遵循先进先出的原则,保证了时间的顺序性。拥有该消 息队列读权限的进程可以从消息队列读出数据,拥有该消息队列写权限的进程可以向消息队列发送数据。(2)消息作为节点一个一个地存放在消息队列里,可把消息队列比作信箱,消息比作依次顺序存放的信件。地址比作消息类型,内容为消息。支持双向传输,可以使用消息类型区分不同的消息。,其实消息队列说白了就是用来存放消息的链表。(3)消息队列不再局限于父子进程,在任何两个进程间都能通信。重要提示:消息队列是linu
2022-05-12 16:25:02
1352
原创 Linux系统编程之进程间的通信方式(无名管道与命名管道)
进程间的五种通信方式(IPC):1、管道(无名管道),速度慢,容量有限,只有父子进程能通讯;2、FIFO(命名管道),任何进程间都能通讯,但速度慢;3、消息队列,容量受到系统限制;4、信号量,不能传递复杂消息,只能用来同步;5、共享内存区。一、管道:管道:通常指无名管道,是UNIX系统中IPC最古老的形式。1.特点:它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。它可以看成是一种特殊的文件,对于它的读写也
2022-05-10 15:14:27
361
原创 Linux系统编程之进程中的system函数与popen函数
1.system函数system的返回值如下:成功的话,返回进程的状态值;当sh不能执行时,返回127,失败则返回-1详细请参考精彩博文:system函数精彩讲解system函数例子:#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ printf("this is system!\n"); if(system("ps") == -
2022-04-28 15:42:10
288
原创 Linux系统编程之进程中的exec族函数
exec族函数的作用我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。详细参考精彩博文:exec族函数精彩博文直接上例子:echoarg.c#include <stdio.h>int main(int argc,char *argv[]){ int i = 0; for(i = 0; i <
2022-04-28 15:17:07
361
原创 Linux系统编程之进程退出,父进程等待子进程退出
1.首先讲一下进程的退出进程的退出分为正常退出和异常退出:正常退出:(1)main函数调用return(2)进程调用exit(),标准C库(3)进程调用_exit()或_Exit(),属于系统调用(4)进程最后一个线程返回(5)最后一个线程调用pthread_exit异常退出:(1)调用abort(2)当进程收到某些信号时,例如Ctrl+c(3)最后一个线程对取消(cancellation)请求做出响应以上三张图片是对进程退出的补充,在第二第三张图中的exit(),_exit
2022-04-28 14:05:07
2464
原创 linux系统编程之进程创建实战,fork与vfork创建进程的区别
1.首先我们先来了解一下fork创建进程:(1)使用fork函数创建一个进程,pid_t fork(void),fork函数调用成功的话,返回两次返回值为0, 代表当前进程是子进程。返回值为非负数,代表当前进程是父进程。 调用失败的话,返回-1。重要提示:调用fork函数时,父进程的返回值就是子进程的进程ID,而子进程的返回值是0;(2)fork函数创建一个子进程的一般目的(3)fork编程实战(4)直接上代码#include <stdio.h>#in
2022-04-27 20:35:03
418
原创 Linux系统编程之API(fputc、fget和feof)
1.函数fputc;函数原型: int fputc(int c, FILE *stream);返回值:如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。c -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。注意:该函数是一个字符一个字符的写进的,并不是一串一串的写,还有其实这个函数跟write是一样的,就是将字符写进文件的意思。上代码:#inc
2022-04-21 21:06:54
398
2
原创 Linux系统编程之文件的标准C库里的fopen,fread,fwrite,fseek等,并用标准C库的函数实现将整数结构体和结构体数组写进文件里
经过之前那么多节的学习,对文件的打开,关闭等操作有了很大的理解,那么今天我们来聊一下标准C库里的打开关闭等函数。1.首先来看一下标准c库里的fopen函数函数原型: FILE *fopen(const char *path, const char *mode);fopen返回的是FILE类型的字符流。path:要打开的文件名(含路径,缺省为当前路径);mode:打开的方式,例如“w+”就是以可读可写的方式打开,若文件不存在并创建,若存在则将原来的内容清空, (还有很多想“w+”的这
2022-04-21 20:25:14
589
原创 Linux系统编程之常用的几个API之read、lseek、creat
上一篇博文说到了open和write函数,这一篇继续来说一下剩下的几个API,分别是read、lseek和creat。1.read函数原型是: ssize_t read(int fd, void *buf, size_t count);read函数的返回值是读取到的字节数(即count),fd为文件描述符,count是读取到的字节数,buf是字节缓冲区。read函数的含义是:从fd所指向的文件中读取count个字节的内容存到字节缓冲区buf去。重要提示:在使用read函数时,一定要注意文
2022-04-18 22:17:53
567
原创 Linux系统编程之文件常用的几个API之open、write
前言:从这个博文开始我们开始学习Linux相关的编程,探索Linux奥秘1.第一个API函数是open函数open有两种表现形式 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);open函数返回的是一个对应的文件描述符pathname:要打开的文件名(含路径,缺省为当前路径)flags:以什么的方式打开,O_RDONLY(只读打开),O_WRON
2022-04-18 21:09:58
752
1
原创 C语言之动态创建链表的两种方式
之前我们说的链表是基于静态创建的,但静态创建的链表很不灵活而且在工作中的项目中的很多场景都不适合,所以我们来记录一下链表的两种动态创建的方式。1.方式一:链表动态创建之头插法那么我们直接上代码讲:struct Test* insertLinkfrontHead(struct Test *head,struct Test *new){//动态创建链表之头插法 if(head == NULL) { head = new; } else { new->next = h
2022-04-14 15:45:20
2835
原创 C语言之删除链表指定的结点与修改链表指定结点
这一节讲链表增删改查中的改跟删1.删除链表中元素例子:1->2->3->4->5删除也分两种情况,一种是否是删除头结点,二是正常删除链表的结点。(1)删除头结点(切记,链表无论是插入还是修改还是删除,一旦动了头结点一定要返回一个新的头结点);struct Test* point = head; if(point->data == data) { head = head->next; free(point);//其实这里要有个free的,但是这是静
2022-04-14 14:52:34
6104
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人