自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 扫雷游戏——

define ROWS ROW+2//防止数组在排雷的时候数组越界#define COLS COL+2//防止数组在排雷的时候数组越界int main()doprintf("请输入:\n");break;default:printf("您输入的数据有问题\n");return 0;

2023-11-04 10:22:24 79

原创 Shell脚本基本控制语句

【代码】Shell脚本基本控制语句。

2023-10-09 09:37:43 89

原创 SQLite相关C接口函数

参考文章。

2023-09-26 19:54:18 170

原创 SQLite-表的创建(增删改查)

4、查看数据库的内容。

2023-09-24 10:01:06 1263

原创 Linux线程介绍

互斥性:互斥量可以确保同一时间只有一个线程可以获取到互斥量,并访问被保护的共享资源。当一个线程获取到了互斥量后,其他线程需要等待,直到该线程释放互斥量才能继续执行。排他性:互斥量保证了对共享资源的独占访问,避免了多个线程同时修改共享资源导致的数据不一致性和竞态条件。正确性:通过在访问共享资源之前获取互斥量,以及在访问完成后释放互斥量,可以确保线程按照期望的顺序和逻辑访问共享资源,并避免了因为线程交叉执行导致的错误结果。

2023-08-25 17:36:56 80

原创 linux进程间的通信-信号量(semget、semstl、semop)

若flag包含SEM_UNDO,则当进程退出的时候会还原该进程的信号量操作,这个标志在某些情况下是很有用的,比如某进程做了P操作得到资源,但还没来得及做V操作时就异常退出了,此时,其他进程就只能都阻塞在P操作上,于是造成了死锁。sem_perm结构的uid和cuid成员被设置成当前进程的有效用户ID,gid和cuid成员被设置成当前进程的有效组ID。semnum:是要操作的信号量在集合中的索引,通常为0,表示第一个信号量。得到一个信号量集标识符或创建一个信号量集对象并返回信号量集标识符。

2023-08-22 23:50:49 555

原创 Linux进程间的通信-信号(signal、kill、sigaction、sigqueue)

对于每个信号来说,系统都对应由默认的处理动作,当发生了该信号,系统会自动执行。二、sigaction 函数用于设置信号的处理方式,它提供了更为灵活和可靠的信号处理机制,相较于较旧的 signal 函数,更推荐使用 sigaction。函数向指定的进程发送信号,传递了进程的 PID、信号编号和附加的值。发送失败时,函数返回 -1,并打印错误信息。当处理某个信号时,可以屏蔽其他特定的信号,以避免信号处理函数被其他信号中断。函数将命令行参数转换为整型,获取了要发送信号的进程的 PID 和要发送的信号编号。

2023-08-21 17:49:25 259

原创 linux进程间的通信-共享内存

特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。在实际使用中,可以根据具体需求调用这些函数进行共享内存的创建、连接、访问和管理操作。函数将共享内存段连接到进程的地址空间中。访问共享内存:通过操作指针来读取和写入共享内存中的数据,就像访问普通的内存一样。删除共享内存:在最后一个进程使用完共享内存后,可以调用。分离共享内存:当不再需要使用共享内存时,调用。

2023-08-20 14:15:30 37

原创 进程间的通信——消息队列

消息队列是在内核中创建和维护的,用于存储和传递消息。每个消息都有一个类型和数据部分,进程可以按照类型从消息队列中读取特定类型的消息。注意,该大小必须至少大于等于消息结构体的大小,以确保能够容纳接收到的消息内容。函数生成的 key 可能在不同系统上有不同的表示方式,因此在跨平台的程序中需要小心使用。是一个用于生成唯一标识符(key)的函数,通常用于创建共享内存和消息队列等进程间通信机制。:指向要发送的消息的指针,通常是一个自定义的结构体指针。:指向消息缓冲区的指针,用于接收接收到的消息内容。

2023-08-20 02:39:39 120

原创 进程通信-管道

阻塞式读写操作:当一个进程打开一个命名管道进行读取时,如果没有数据可用,它将被阻塞,并在有数据可用时恢复。相反,当一个进程向命名管道写入数据时,如果管道已满,它将被阻塞,并在有空间可用时恢复。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。函数创建的管道)不同之处在于,命名管道有一个关联的文件路径(即文件名),可以在文件系统中进行访问。持久性:与无名管道不同,命名管道具有持久性,即使创建管道的进程结束或关闭,命名管道仍然存在于文件系统中,直到被显式删除。

2023-08-18 11:35:34 45

原创 linux系统编程-标题深入理解 fork-execl、system 和 popen:使用方法、参数说明和区别

函数,而是继续自己的执行流程,那么父进程和子进程将并发执行,互不等待。这可能会导致一些问题,例如父进程结束了但子进程仍在执行,造成子进程成为孤儿进程(即没有父进程管理),或者子进程结束后无法获取其退出状态。在 Linux/Unix 环境下,有几种常用的方法可以创建子进程并执行外部命令,其中包括 fork-execl、system 和 popen。这样可以确保父进程在子进程完成后再继续执行,并且可以获取到子进程的退出状态,以进行必要的处理。函数用于关闭管道并等待子进程结束,并返回子进程的退出状态。

2023-08-16 19:51:11 152

原创 linux系统编程-进程-exec族函数

file:如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。是一个全局变量,它是一个指向字符串指针的指针数组。数组中的内容,但可以通过其他方式来操作环境变量,比如使用标准库中的函数来获取、设置或删除环境变量。v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。函数成功执行,它将不会返回,后续的代码也不会被执行。

2023-08-15 16:23:11 476

原创 Linux系统编程-进程-wait && waitpid

wait()函数的参数是一个指向int类型的整数指针,用于存储子进程的退出状态信息。它返回子进程的进程ID(PID),如果出错则返回-1。wait()函数的行为如下:如果当前没有子进程或所有子进程都已经结束,则wait()函数将阻塞父进程,直到有一个子进程结束。当有子进程结束时,wait()函数会返回结束的子进程的PID,并将子进程的退出状态存储在传入的status指针所指向的位置。通过解析status,可以获取子进程的退出状态和其他信息。

2023-08-14 19:54:18 145

原创 linux系统编程-进程-进程退出

不同,它们不会调用已注册的退出处理程序和标准I/O库的清理操作。因此,在使用这两个函数时,需要确保已经处理好可能的资源释放和关闭操作。函数将进程终止,并返回一个指定的退出状态码给操作系统。通常,非零的退出状态码表示进程异常终止,而0表示进程正常终止。这两个函数通常用于在发生严重错误或异常情况下立即退出进程,而不需要执行任何后续的清理工作。函数结束时,进程会自动退出,并将返回值作为退出状态码传递给操作系统。函数在每个进程中都是独立的,子进程的退出处理函数不会传递到父进程。是C语言中用于立即终止进程的函数。

2023-08-14 16:11:48 136

原创 linux系统编程-进程2-vfork && exit

返回值大于0,表示当前代码正在执行的是父进程的上下文中。返回值是子进程的 PID(进程标识符),可以通过这个 PID 来区分父进程和子进程,并对它们进行不同的操作。但需要注意的是,在子进程执行期间,应该避免对共享数据进行修改,以免破坏父进程的状态。在创建子进程时并不会复制父进程的地址空间,而是直接与父进程共享地址空间。函数通过创建一个新的子进程来实现,新的子进程几乎和父进程共享地址空间。在创建子进程时并不会复制父进程的地址空间,而是直接与父进程共享地址空间。是一个函数原型,用于创建一个新的子进程,与。

2023-08-14 15:33:13 70

原创 Linux系统编程-进程1-fork

但是,在创建子进程后,子进程和父进程会独立执行,它们可以独立地修改各自的地址空间中的内容。函数创建子进程时,操作系统会为子进程分配一个与父进程相同的地址空间,并且将父进程的整个地址空间复制到子进程中。该函数在成功创建子进程时,在父进程中返回子进程的进程ID,在子进程中返回0。函数后,操作系统会创建一个新的子进程。而子进程的执行与父进程是并发的,具体谁先执行并没有确定的规则。请注意,子进程获得的是父进程的副本,而不是引用。函数后,父进程和子进程都会继续执行接下来的代码,但是它们各自有不同的进程ID。

2023-08-14 14:52:08 40

原创 文件编程4-写一个链表到文件中

结构体写入和读取:该代码中,通过直接将结构体的内存内容写入文件,在读取时同样直接读取特定大小的字节,这样可以确保结构体的完整性。如果使用文本方式进行写入和读取,很可能会导致数据的丢失或错误,因为文本方式会对数据进行编码和解码,从而可能改变数据的内容。综上所述,使用二进制方式进行文件的写入和读取,能够确保数据的完整性,并且具有更高的通用性。但需要注意的是,在读取二进制文件时,需要确保读取的数据按照正确的格式进行解析,以免出现数据错误的情况。数据完整性:使用二进制方式可以确保数据在存储和读取过程中的完整性。

2023-08-11 18:10:54 114

原创 Linux文件编程应用3-写入结构体到文件中

你会发现读出的结果是正确的问什么文件里边确实一些乱七八糟的东西,实际上这并不是乱七八糟的东西,只是以二进制方式写入的。

2023-08-11 16:45:53 61

原创 Linux文件编程应用2-实现linux系统下cp指令

ok接下来我们来验证下,首先源文件是dem05.c,目标文件为new.c(我们实现路径下没有,让它自己创建)

2023-08-11 16:26:40 37

原创 linux文件编程应用1-修改配置文件

【代码】linux文件编程应用1-修改配置文件。

2023-08-11 16:15:12 29

原创 linux文件编程-lseek

函数用于在打开的文件中设置文件偏移量(file offset)。通过更改文件偏移量,可以控制下一次读取或写入文件时的位置。类型的值,表示设置后的文件偏移量。随机访问:通过更改文件偏移量,可以实现对文件的随机访问,而不是按顺序逐个读取或写入文件。函数在文件中设置任何位置的文件偏移量,以便读取或写入文件的特定位置。每次结束写操作后,如果想从头读取文件内容记得定位到文件开头。:一个整数,表示打开文件的文件描述符。参数指定的位置的偏移量。函数结合使用来截断文件的长度。函数打开文件后返回的值。类型的值,表示相对于。

2023-08-11 15:55:41 116

原创 Linux文件编程-creat

函数返回一个整数值,即文件描述符(file descriptor)。如果创建文件失败,将返回 -1,并且可以通过检查错误号(:一个表示文件权限的模式参数,通常以八进制表示。函数是一个用于创建新文件的系统调用函数。:一个字符串,表示要创建的文件的路径名。)来获得具体的错误信息。

2023-08-11 15:34:42 207

原创 linux文件编程-read

函数的返回值是实际读取的字节数,如果出现错误,返回值会有特定的负数。函数是用于从文件描述符中读取数据的系统调用函数。

2023-08-11 15:26:57 33

原创 Linux文件编程-write

函数是在 C 语言中用于向文件描述符(file descriptor)写入数据的函数。相关联的文件或设备中。它返回实际写入的字节数,如果发生错误,则返回 -1,并设置全局变量。中写入到与文件描述符。表示具体的错误类型。

2023-08-11 15:20:48 73

原创 Linux文件编程-open

因此,fd = open("./file1", O_RDWR | O_CREAT, 0600) 的代码表示以读写模式打开文件 "./file1",如果文件不存在则创建它,并将文件的权限设置为 rw-------。在Linux系统中,文件权限由三个数字组成,分别表示所有者(user)、所属组(group)和其他人(others)的权限。将权限值转换为二进制形式,可以得到 110 000 000,对应于 rw------- 权限,意味着只有文件所有者可以读取和写入该文件,而其他用户没有任何权限。

2023-08-11 14:37:15 26

原创 osTimerStart() / xTimerStart() / xTimerChangePeriod()

定时器句柄(Timer Handle):它是一个指向已经创建的定时器的指针或标识符。函数可以使定时器开始计时,并按照预设的时间间隔触发定时器的回调函数。函数可以动态地修改定时器的周期,使其在运行时适应不同的时间间隔需求。需要注意的是,在调用这两个函数时,传入的时间参数应该根据具体应用的需求进行合理的设定,并使用正确的时间单位(时钟节拍)。需要注意的是,在使用这两个函数之前,您需要先创建一个定时器,并获取其句柄。的作用是启动一个已经创建的定时器,使其开始计时并按照预设的时间间隔触发定时器的回调函数。

2023-08-05 23:49:33 1043

原创 二值信号量(Binary Semaphore)和互斥量(Mutex)

综上所述,虽然二值信号量和互斥量在某些情况下可以实现相似的功能,但它们之间仍有一些区别。而如果需要更复杂的同步和互斥机制,或者需要处理资源竞争问题,互斥量可能更为合适。当互斥量被多次获取时,每个获取操作都需要对应的释放操作,以确保计数准确。持有权:互斥量具有"持有权"的概念,即只有当前持有互斥量的任务可以释放它。而二值信号量没有持有权的概念,任何任务都可以释放一个二值信号量。二值信号量(Binary Semaphore)和互斥量(Mutex)在功能上有一些区别,尽管它们都可以用于任务间的同步和互斥。

2023-08-05 11:04:52 801

原创 xEventGroupWaitBits()

函数原型: EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait );它允许任务等待事件组位的改变,以实现任务间的同步和协调。

2023-08-05 09:41:11 1004

W806学习资料文件,W806安装包

W806学习资料文件,W806安装包

2024-04-29

空空如也

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

TA关注的人

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