自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 收藏
  • 关注

转载 write函数的详解与read函数的详解

write函数的详解与read函数的详解-CSDN博客--转载记录一下防止丢失

2024-02-24 23:03:38 65

原创 char 、unsigned char、const char区别

1.const char的意思是该字符是。比如const char ch = 'a';是告诉编译器,这个当你给这个变量重新赋值的时候,会发出warning,提示用户。const char *和 char const * 以及char * constBjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。( * 读成 pointer to )

2024-02-24 11:17:07 941

转载 为什么.h文件里需要#ifndef、#define和#endif?

有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。#include “a.h”** 和**#include “c.h”**此时就会造成c.h重复引用。

2024-02-22 21:16:53 198

原创 嵌入式--全志H616--SQlite3--c代码建表插入数据

目标:使用c代码创建新数据库,包含表与数据一)sqlite3_exec2.说明第一个参数sqlite3*是打开的数据库;第二个参数const char *sql是要执行的sql语句;第三个参数int (*callback)(void*para,int argc,char**argv,char**argv_name)是回调函数;第四个参数void *para是传递给回调函数的参数第五个参数char **errmsg是如果sqlite3_exec函数执行发生错误返回的错误信息;

2024-01-21 16:30:07 407

原创 linux--香橙派下--自动挂载u盘

在/etc/udev/rule.d/ 下创建 .rules文件。这条规则的意思是:如果有一个设备的内核名称为。,则该条件生效,执行后面的赋值:在。里最重要的部分,默认是存放在。所有的规则文件必须以。的设备文件,并把设备文。

2024-01-09 23:23:59 739

原创 orangepi——蜂鸣器简单应用和首行缩进设置

编译:gcc blink.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt。进入到解压的wiringOP-next中,进入examples文件夹,复制blink.c进行代码修改。命令:sudo vi /etc/vim/vimrc:用超级用户进入修改页面。给build.sh添加运行权限:chmod +x build.sh。运行:./build.sh:就能进行编译生成a.out可执行文件。sudo ./a.out 代码运行。保存为build.sh。

2023-12-26 21:43:07 615

原创 orangepi——基于官方外设开发

外设就是普通io口、串口、i2c等。wiringPi外设。

2023-12-26 21:35:53 684

原创 orangepi--开发板配置网络SSH登录

ifconfig-------------------------------------查看网络地址。nmcli dev wifi-------------------------------查看wifi。ip addr show wlan0---------------------------查看ip地址。sudo passwd orangepi-------------------------改密码。reboot---------------------------------------重启。

2023-12-26 21:33:04 470

原创 Linux--网络编程-ftp(TCP)网络通信-文件交互

strcmp()函数首先将str1字符串的第一个字符的ACSII值减去str2第一个字符的ACSII值(自左向右逐个字符相比,直到出现不同的字符或遇'\0'为止)函数说明:调用fflush()会将缓冲区中的内容写到stream所指的文件中去.若stream为NULL,则会将所有打开的文件进行数据更新。4.2.2 ls:popen文件,fread读取文件,send发送文件到客户端。4.2.1get:open打开文件,read文件,send文件到客户端。3、连接上以后获取用户的输入,对输入的信息进行处理。

2023-12-04 23:14:29 260 1

原创 Linux--网络编程

设置能处理的最大连接数,listen() 并未开始接收连接,只是设置socket 的 listen 模式,listen 函数只用于服务端,服务器进程不知道要与谁连接,因此,它不会主动要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并对他做出处理,一个服务进程可以同时处理多个客户进程的连接。1.hostlong是网络字节顺序表达的32位数,ntohs中的,n–net网络,to–toh–host主机地址,s–unsigned long无符号的短整型(32位的系统是4字节);

2023-11-21 00:04:31 434

原创 Linux--线程-条件控制实现线程的同步

pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量PTHREAD_COND_INITIALIZER赋给静态分配的条件变量,但是如果条件变量是动态分配的,可以使用pthread_cond_destroy函数对条件变量进行去除初始化(deinitialize)。pthread_cond_signal函数将唤醒等待该条件的某个线程,而pthread_cond_broadcast函数将唤醒等待该条件的所有进程。pthread_cond_wait返回时,互斥量再次被锁住。

2023-11-05 23:05:21 285

原创 Linux--线程--互斥锁

如果调用pthread_mutex_trylock时互斥量处于未锁住状态,那么pthread_mutex_trylock将锁住互斥量,不会出现阻塞并返回0,否则pthread_mutex_trylock就会失败,不能锁住互斥量,而返回EBUSY。前提条件是定义了两把锁,其中一个线程拿到了第一把锁和第二把锁,另外的一个线程拿到了第二把锁和第一把锁,然后他们都在争用锁的使用权,因为都解他们各自拥有的第一把所,所以一直卡在争用锁锁的使用权。c)因为主线程不上锁,在先拿到锁的线程在跑的过程中,主线程也会跟着跑。

2023-11-01 23:16:48 276 1

原创 linux--线程共享内存

Linux线程共享内存空间是指多个线程可以访问同一个内存区域,这些线程共享该内存区域的内容。对全局变量进行操作,共享内存空间。

2023-10-31 22:47:20 140

原创 Linux线程--创建及等待

而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

2023-10-22 21:55:49 179

原创 C语言学习--结构体与联合体

各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。一、结构体struct。二、联合体union。

2023-10-18 22:50:58 115

原创 linux进程间通讯--信号量

如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。需要注意的是,信号量的值只能通过PV操作来改变。该函数的主要作用是执行对一个或多个信号量的原子操作,包括P操作(sem减1)和V操作(sem加1),以实现进程间的同步与互斥。IPC_EXCL只有信号量不存在的时候,新的信号量才建立,否则就产生错误。第一个信号的编号为0;功能:创建一个新的信号量或获取一个已经存在的信号量的键值。

2023-10-18 01:19:51 189

原创 Linux信号 signal()编程

结构体中的 sa_mask 成员,设置在其的信号集中的信号,会在捕捉函数调用前设置为阻塞,并在捕捉函数返回时恢复默认原有设置。因此,可以保证在处理一个给定信号时,如果这个种信号再次发生,那么他会被阻塞到对之前一个信号的处理结束为止。sigqueue 函数不但可以发送额外的数据,还可以让信号进行排队(操作系统必须实现了 POSIX.1的实时扩展),对于设置了阻塞的信号,使用 sigqueue 发送多个同一信号,在解除阻塞时,接受者会接收到发送的信号队列中的信号,而不是直接收到一次。

2023-10-12 01:14:14 446

原创 嵌入式Linux--进程间通信--共享内存

3、数据交换——写入(strcpy),读取(p指针指向内存空间,print(p))//2.连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1。6、信号量(不作为进程间通信的方式,控制一个临界资源)//1.创建或获取一个共享内存:成功返回共享内存id,失败返回-1。//4.控制共享内存的相关信息:成功返回0,失败返回-1。1、创建/打开共享内存——shmget。//3.断开与共享内存的连接:成功返回0,失败返回-1。5、干掉共享内存——shmctl。4、释放共享内存——shmdt。

2023-09-21 22:58:58 97

原创 嵌入式Linux--进程间通讯--消息队列

3、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。消息队列,是消息的链接表,存放在内核中。特点:1、消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。1、如何创建消息队列(A\B使用同一个队列通信)//创建或打开消息队列:成功返回队列id,失败返回-1。2、如何加消息到队列(队列是链表)//读取消息:成功返回消息数据的长度,失败返回-1。//控制消息队列:成功返回0,失败返回-1。//添加消息:成功返回0,失败返回-1。B:①获取队列②写队列。

2023-09-20 23:50:28 150

原创 Linux--进程间通讯--FIFO(open打开)

实际上,创建一个FIFO命名管道的时候,内核会为FIFO(伪)文件开辟一个缓冲区,操作FIFO文件就相当于操作这个缓冲区,以此来实现进程间的通信,这种通信实际上就是文件读写的操作来实现的。(可以把FIFO理解为一个文件,一个进程向该文件写数据,另一个进程从该文件中读书数据,前提是两个进程读写的是同一个FIFO文件才能实现通信)使用库函数创建:mkfifo()函数,并且一旦使用mkfifo()创建了一个FIFO,就可以使用open来打开它,常见的文件I/O函数都可用于FIFO。数据,一个进程从FIFO。

2023-09-12 23:03:13 886

原创 linux--进程通信--管道通信

③它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。· ②只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程)单机:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、要关闭管道,只需要将这两个文件描述符关闭即可close(fd[0]);特点:①它是半双工的(数据只能在一个方向上流动),具有固定的读端和写端。1、管道:通常指无名管道,是UNIX系统IPC最古老的形式。fd[0]为读而打开,fd[1]为写而打开。

2023-09-09 22:13:00 246

原创 linux--进程--system与popen函数

popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:成功 /失败。要注意的是,system运行完后,父进程还会继续向下运行,这点与execl函数不同。对TEST.config文件内容进行修改,将LENG=1,改成LENG=5。当使用system时,ret的值无法读出,用popen函数;argv[0]:./test //程序地址。argv[1]:aa //以下为程序参数。运行:./a.out TEST.config。无法获得system的值,需要使用popen。

2023-09-09 01:25:43 299

原创 int main(int argc,char* argv[]) 的含义和用法

argv是一个char *的数组,其中存放指向参数变量的指针,此处argv[0]指向test.exe的全路径名或test.exe,argv[1]指向test,argv[2]指向hello。main(int argc, char* argv[ ]),其中argc是指变量的个数,本例中即指test和hello这两个变量和程序运行的全路径名或程序的名字,argc即为3。而执行edit f1.txt时,argc的值为2,argv[0]指向edit,argv[1]指向f1.txt。argv[argc]为NULL。

2023-09-08 23:42:37 2197

原创 Linux--进程--进程-父进程退出

如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就像这样:pid = wait(NULL);

2023-09-08 21:30:09 550

原创 linux-进程-execl族函数

我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。可执行文件既可以是一个二进制文件,也可以是任何linux下可执行的脚本文件。分别是:execl,execlp,execle,execv,execvp,execvpe。echo $PATH:显示当前PATH环境变量,该变量的值由一系列以冒号分隔的目录名组成。,表示你需要执行谁,往后的参数也就是和execl的传参一样。//我的目录下是没有文件file的。

2023-09-07 22:38:19 938

原创 Linux--进程--vfork与fork区别

vfork():子进程共享父进程的地址空间(准确来说,在调用 exec(进程替换) 或 exit(退出进程) 之前与父进程数据是共享的)vfork():保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程,但它们创建的子进程是有区别的。成功:子进程中返回 0,父进程中返回子进程 ID。2.fork(): 子进程拷贝父进程的地址空间,子进程是父进程的一个复制品。

2023-09-03 23:33:26 169

原创 c语言-exit函数

exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS(操作系统),这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出,非0 为非正常退出。6. 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。return():返回函数,若在主函数中,则会退出函数并返回一值。

2023-09-03 23:09:57 351

原创 Linux--进程--创建子进程一般目的

父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当请求到达,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求的到达。—fork—客户端2。—fork—客户端3。父进程创建子进程的目的:简单来说:给特定的输入,给出特定的输出。服务器—fork—客户端1。

2023-09-03 17:33:39 549

原创 Linux编程--进程--fork使用,创建父子进程

返回值为非负数,代表当前进程为父进程。返回值为0,代表当前进程是子进程。

2023-09-02 16:58:13 348

原创 linux编程--进程--进程相关概念

fork函数包含在unistd.h库中,其最主要的特点是,调用一次,返回两次,当父进程fork()创建子进程失败时,fork()返回-1,当父进程fork()创建子进程成功时,此时,父进程会返回子进程的pid,而子进程返回的是0。进程是程序的一次运动活动,程序跑起来了,系统中就多了一个进程。3.进程标识符(Process ID)是进程描述符中最重要的组成部分,是在当前 Linux 系统中唯一的一个非负整数,用于标识和对应唯一的进程。4.父进程&子进程:进程A创建进程B,A为父进程,B为子进程。

2023-09-02 12:11:10 240

原创 Linux系统编程--文件编程--打开创建文件

O_TRUNC属性去打开文件时,如果这个文件中本来时有内容的,而且为只读或只写成功打开,则将其长度截短为0.flags:权限:O_RDONLY只读打开, O_WRONLY只写打开, O_RDWR可读可写打开。mode:一定是flages中使用了O_CREAT标志,mode记录待创建的文件的访问权限。当我们附带了权限后,打开的文件就只能按照这种权限来操作,以上3个常数中应当只指定1个。-为普通文件,r为可读权限,w为可写权限,x为可执行权限。4为可读(r),2为可写(w),1为可执行(1)

2023-08-26 20:18:31 298

原创 嵌入式Linux编程--贪吃蛇

程序都是从上到下运行,要想2个同时运行,需要线程;一个程序有多个线程,互不影响。vi /usr/include/curses.h 查看相应按键编码。使用ncurse是因为案件响应灵敏,不用回车;方向头文件,include<curses.h>创建.c文件,同时gcc编译也需要添加。为创建的函数,null为函数中的参数。,定义的该函数返回值是void*型。,gcc编译的时候需要添加。3.食物随机,不出边界。4.制作贪吃蛇方向按键。

2023-08-05 23:45:08 286

原创 嵌入式linux-C语言学习-链表2

尾插法的链表:不输入0,一直循环,head2一直加节点在while循环中,知道输入0,直接结束循环。注意:结构体中,辅助指针p的作用,head指针必须一直指向链表第一个节点。实现:链表头插法,尾插法,删除。

2023-07-30 01:42:06 48

原创 嵌入式inux-C语言编程-链表1

实现:链表查找,指定前后插入数据,改变数据。

2023-07-30 01:32:51 48

原创 嵌入式Linux学习--基础操作命令

cp b.c test.c:拷贝b.c文件并新建test.c文件,将b.c里内容拷贝到test.c里。mv *.c chenlichen:将所有.c文件异动到该文件夹里。vi mingcheng.c:进入或创建vi命令行模式,编写程序。gcc firstcord.c:编译该程序,会生成a.out文件。:wq :vi命令行模式下按冒号,后输入wq,w保存,q退出。mv a.c b.c:将a.c文件变成b.c文件。esc:退出输入模式,进入vi命令行模式。./:./+生成的文件名:运行该程序。

2023-07-18 22:35:18 51

原创 嵌入式c语言学习--选票系统3

定义结构体指针函数struct Person *initnum(struct Person *p,int *pnum)目的,返回的是指针变量,改变主函数内的结构体值,用指针传参方便。推荐听小破站浙大翁恺的c语言关于结构体和指针,和malloc几节课,帮助很大,这些老陈讲的不行。知识点:malloc函数动态开辟空间,与null。用结构体函数,完善选票系统。

2023-07-12 00:35:37 50

原创 嵌入式C语言学习--结构体成绩2

p->name(数组名就是地址) &n[i].name。结构体定义: 访问方式。p->num(由结构体定义决定跟,指针p关系不大) &n[i].num。])(访问整形数组里具体的位置--索引)&n[i].scores。*2 p++可相当于行变化,具体访问数组那个位置要确定i的值。

2023-07-09 19:42:46 40

原创 嵌入式c语言学习--结构体指针选票系统2

要注意初始化,最好间接赋值。

2023-07-09 17:38:53 48

原创 嵌入式c语言学习--结构体选票系统

【代码】嵌入式c语言学习--结构体选票系统。

2023-07-05 22:54:06 69

原创 嵌入式c语言学习-结构体小应用

【代码】嵌入式c语言学习-结构体小应用。

2023-07-03 23:29:31 34

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除