![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
文章平均质量分 61
lucky_白杨
且行且珍惜
展开
-
Unix C语言 POSIX 互斥锁 线程同步
文章目录模拟并发冲突出现该问题的原因POSIX的互斥锁由于线程的并发性,导致多个线程同时对同一个全局变量进行操作时,会出现数据不一致的情况。所以需要在线程中对全局变量的操作上互斥锁,来确保该操作同一时刻只能被一个线程进行,从而确保了数据安全。模拟并发冲突先不着急看互斥锁,先看下互斥锁可以解决什么问题。下面的代码有个int型的num全局变量,开启多个线程同时对该num进行+1的动作,每个线程+1执行1000000次,所有线程执行完毕后,num的值应该等于线程数*1000000。但由于并发执行,结果是原创 2021-04-05 09:40:16 · 296 阅读 · 1 评论 -
Unix C语言POSIX的线程创建、获取线程ID、汇合线程、分离线程、终止线程、线程的比较
文章目录创建线程创建线程函数概述创建线程代码示例获取线程ID获取线程id函数概述获取线程id代码示例汇合线程汇合线程函数概述汇合线程代码示例分离线程第一种方式:后标记分离线程代码示例:第二种方式:创建即分离线程代码示例终止线程代码示例创建线程POSIX标准线程接口需要引入<pthread.h>头文件。创建线程函数概述int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine原创 2021-04-04 11:54:30 · 873 阅读 · 0 评论 -
Unix/Linux IPC进程间通信 - 共享内存 C代码
文章目录概述创建共享内存生成共享内存key创建共享内存映射共享内存解除共享内存映射销毁共享内存ipcs与ipcrm命令C代码示例概述共享内存与管道相比,速度会更快,因为管道需要经过用户空间到内核空间再到用户空间的数据拷贝,而共享内存是在内核空间中分配一块物理内存,并在用户空间中创建一个虚拟内存与该物理内存进行映射,不同进程可以映射到内核空间中同一个共享物理内存,这样就实现了不同进程访问相同的物理内存,由于直接通过指针就可以访问并改变该物理内存,并且直接反应到其他进程中,没有数据拷贝的动作,所以比管道要更原创 2020-10-17 00:47:23 · 436 阅读 · 0 评论 -
Unix/Linux IPC进程间通信 - 有名管道、无名管道 C代码
文章目录IPC概述有名管道管道文件C代码无名管道C代码IPC概述Unix系统中每个进程都有自己独立的虚拟内存空间,除了每个进程的内核空间映射在相同的物理内存中,每个进程的用户空间都被映射在不同的物理内存中。所以,每个进程之间存在内存壁垒,进程之间无法直接通过交换虚拟地址来进行数据交换。那么需要实现进程之间的数据交换,就有了IPC(InterProcess Communication)机制,也就是进程间通信。有名管道由于内核空间在操作系统只有一份,被所有进程所共享,所以进程间通信就可以通过内核空间进行原创 2020-10-15 01:24:38 · 380 阅读 · 2 评论 -
C语言 实现账号密码每日自动变更 每日密码生成步骤
文章目录需求密码生成过程代码实现需求一些账号可能是提供给外部人员登录维护,需要将系统账号或者其他账号在每天都能自动更新,而无需人工更新。所以需求如下:1、更新的密码是按照特定算法加上给定的种子计算出来的2、在当天计算多次得到同一密码,不同日期计算出不同密码。3、生成的密码无规律可寻。密码生成过程1、用户名与iv向量值转成字节并累计成一个数字,然后加上当前日期作为种子数。2、将种子数通过混沌算法公式计算出一个数出来。3、将2步计算的数转成二进制(长度64)并取每隔8位取其一位,组合成一个8位原创 2020-10-13 00:17:48 · 1146 阅读 · 1 评论 -
Unix 太平间信号 僵尸进程的异步回收
文章目录僵尸进程回收的问题太平间信号C代码示例僵尸进程回收的问题当父进程的一个或多个子进程退出,子进程将变为僵尸进程,父进程在调用wait/waitpid函数对子进程进行回收之前,僵尸进程一直存在,并占用着pid。当父进程退出或者调用wait/waitpid函数,僵尸进程将被回收释放。更多关于僵尸进程可以查看我另外一篇博客Unix 孤儿进程、僵尸进程。如果父进程在调用wait回收子进程之前,有其他任务在处理,那么子进程退出之后变为僵尸进程,没有办法及时的回收。针对这个问题,可以使用太平间信号,来异步原创 2020-09-29 00:19:39 · 431 阅读 · 1 评论 -
Unix C进程信号处理
文章目录常用信号C捕获异常中断信号常用信号信号描述SIGHUP (1)控制终端被关闭SIGINT (2)终端中断符(ctrl+c)信号SIGQUIT(3)终端退出符(ctrl+)信号SIGABRT(6)abort函数产生SIGBUS(7)硬件或对齐错误SIGFPE(8)浮点计算异常SIGKILL(9)强制杀死进程SIGSEGV(11)非法内存访问SIGPIPE(13)写无读端管道SIGALRM(14)闹钟信号原创 2020-09-27 23:40:49 · 282 阅读 · 1 评论 -
Unix 孤儿进程、僵尸进程
孤儿进程当父进程退出,而其一个或多个子进程还处于运行状态,则子进程变为孤儿进程,其父pid变为1,即被init进程接管收养,init进程亦被称为孤儿院进程。僵尸进程当父进程的一个或多个子进程退出,子进程将变为僵尸进程,父进程在调用wait/waitpid函数对子进程进行回收之前,僵尸进程一直存在,并占用着pid。当父进程退出或者调用wait/waitpid函数,僵尸进程将被回收释放。僵尸进程的危害Unix在子进程退出时,会释放其内存空间以及占用的所有资源,但会为其保留进程pid号与退出信息等。除非原创 2020-09-24 01:49:16 · 325 阅读 · 1 评论 -
Unix 父子进程以及创建子进程
Unix 进程Unix系统中进程存在父子关系,父进程拥有多个子进程,子进程只能有一个父进程。pid为0的进程为调度进程,也是根进程。系统中所有的进程构成了一个以调度进程为根的进程树。pid为1的进程是init,init进程负责系统的初始化,同时也负责回收孤儿进程,称为孤儿院进程。当父进程通过fork创建子进程,会复制父进程中的数据区、BSS区、堆栈、命令行参数以及环境变量表到子进程中,只有代码区是共享的。为了创建子进程能更加的轻量,fork创建子进程时,不会进行复制的动作,子进程和父进程共享内存区,只原创 2020-09-22 23:59:36 · 2746 阅读 · 1 评论 -
Unix C 获取进程信息
#include <unistd.h>#include <stdio.h>int main(void) { pid_t pid = getpid(); // 获取当前进程pid pid_t ppid = getppid();//获取父进程pid uid_t uid = getuid();//获取实际用户id gid_t gid = getgid();//获取实际组id uid_t euid = geteuid();//获取当前有效用户id原创 2020-09-22 23:34:31 · 450 阅读 · 1 评论 -
Unix 硬链接与符号链接(软链接)
文章目录硬链接符号链接读取符号链接本身内容硬链接通过命令ln srcfile newfile创建的newfile即为srcfile的硬链接。硬链接的本质,就是一个字符串形式的路径和一个整数的i节点号的对应关系。硬链接的文件内容与创建时指向的源文件一模一样,把源文件删除,不会影响硬链接文件。在文件系统中的i节点维护了该文件的元数据,元数据中就有一个硬链接数,该硬连接数即表示有多少个硬链接文件指向了该i节点。每个普通文件,本身就是一个硬链接,只是硬链接数为1,每对该文件创建一个硬链接,那么硬链接数+1。原创 2020-09-13 18:12:32 · 1373 阅读 · 1 评论 -
Unix 文件锁(共享锁、排他锁)
文章目录文件锁锁类型共享锁(读锁)排他锁(写锁)fcntl函数+flock结构对文件锁的操作代码例子协议锁和强制锁文件锁Unix提供了文件锁机制来防止多进程对同一文件的并发操作导致的脏读和数据混乱,同时也为多进程提供了同步机制。锁类型共享锁(读锁)共享锁也称为读锁。如果一个进程为某个文件的某个区域加了一把共享锁,那么其他进程对该文件的该区域可以加共享锁不能加排他锁。排他锁(写锁)排他锁也称为写锁。如果一个进程为某个文件的某个区域加了一把排他锁,那么其他进程无法对该文件的该区域加任何锁,包括原创 2020-09-12 17:38:07 · 1324 阅读 · 1 评论 -
Unix文件系统
操作系统需将硬盘上面的i节点加载到内核空间中维护成v节点,每个i节点对于一个v节点。文件表项维护了文件的相关状态信息,并维护指向v节点的指针。内核空间的进程表项中,维护了每个进程对应的文件描述符表,每个进程拥有各自独立的文件描述符表,每个进程的文件描述符表默认打开3个,分别为0-标准输入、1-标准输出、3-错误输出。文件描述符的编号以小整数维护,即:始终返回最小可用的编号。子进程继承父进程的文件描述符表。文件描述符维护了文件表项的指针,当用户空间进程程序打开了文件,则在内核空间将创建一个文件表项,..原创 2020-09-10 00:32:46 · 730 阅读 · 1 评论 -
C语言 新增操作系统用户和更改操作系统用户密码
#include <stdio.h>#include <stdlib.h>#include <string.h>int addUser(const char *username) { /** * 新增用户 */ char cmd[64] = "useradd "; int res = system(strcat(cmd, username)); if (res == -1) { perror("ad原创 2020-09-06 23:54:05 · 1498 阅读 · 1 评论 -
C语言 二进制字符串与数值之间的转换
#include <stdio.h>#include <string.h>#include <limits.h>#include <stdlib.h>const static int LONG_BIT_COUNT = CHAR_BIT * sizeof(long);long bstoi(const char *ps, int size) { /** * 二进制转数值 */ long n = 0; for原创 2020-09-04 00:51:21 · 5091 阅读 · 1 评论 -
Unix C的内存分配与释放
文章目录简介标准C的动态内存分配与释放Unix C的动态内存分配与释放模型图例代码示例malloc和sbrk的区别简介Unix中应用程序操作的都是虚拟内存,而虚拟内存与物理内存存在一个映射,映射最小单位为页,一页为4098个字节。内存分配就是指建立一块虚拟内存与物理内存之间的映射。释放内存就是解除虚拟内存与物理内存的映射。标准C的动态内存分配与释放C中有多个存储类别,分别为:静态存储期、线程存储期、自动存储期、动态分配存储期。所有内存都需要预留足够的空间来存放数据,在函数中定义的非static变原创 2020-09-03 01:53:51 · 444 阅读 · 1 评论 -
段错误
段错误试图访问未与物理内存建立映射关系的虚拟内存,或者访问未赋予权限的受保护的内存,将引发段错误信号SIGSEGV(11),进程接收到该信号将终止。引发段错误的代码int main(void) { int *ip = (int *) 0x00; //一个不存在的地址 *ip = 1;//试图操作不存在的内存地址// char *str = "abc"; //字面常量只读// str[0] = 'A'; //试图修改无权限的数据 return 0;}原创 2020-09-01 23:10:56 · 159 阅读 · 0 评论 -
Linux进程映象的内存布局
进程内存布局操作系统的进程内存分为5个区,代码区、数据区、BSS区、堆区、栈区,更高层就是命令行参数和环境变量表,进程的内核空间与用户空间分别对应不同的内存区。vmlayout.c#include <stdio.h>#include <stdlib.h>const int const_global = 1; // 全局常量 (代码区)static const int static_cons_global = 3; //全局静态常量 (代码区)int init_g原创 2020-09-01 02:43:55 · 416 阅读 · 1 评论 -
C语言 共享库的动态加载
文章目录动态加载C动态加载函数动态加载共享库例子动态加载共享库的加载分静态加载和动态加载。直接使用gcc编译器加载的共享库的方式叫静态加载,而通过程序代码加载共享库的方式称为共享库的动态加载。什么时候采用共享库的动态加载方式呢?比如需要通过程序判断A条件下,加载A共享库,B条件下加载B共享库,或者条件未达到的情况下加载默认库。这种需求,可以不通过gcc编译器,而通过代码来实现动态加载。C动态加载函数C提供了dl库来实现共享库的动态加载。在C代码文件中加入#include <dlfcn.h&原创 2020-08-31 00:28:09 · 1850 阅读 · 1 评论 -
C语言 共享库(动态库)制作
文章目录共享库简介共享库制作代码实现创建共享库链接使用共享库小结共享库简介共享库的本质就是将多个目标文件打包成一个文件。链接共享库就是在可执行文件中调用共享库中函数的指令处插入一些指令,在运行时通过执行这些指令来完成加载共享库以及计算出所调函数入口地址的动作。使用共享库的可执行文件占用磁盘和内存相对于静态库要小。共享库中的代码一旦被修改,只要函数接口不变,无需重新链接。使用共享库的可执行文件在运行时,需要依赖共享库。一旦共享库被删除,则可执行文件无法运行。共享库的文件形式为:lib<库名>原创 2020-08-30 21:40:56 · 3020 阅读 · 1 评论 -
C语言 静态库制作
静态库的本质就是将多个目标文件打包成一个库文件。链接静态库就是讲库中被调用代码复制到可执行文件中。使用了静态库的可执行文件占用磁盘空间和内容空间都比较大,静态库中代码被修改后,需重新生成库文件并重新链接库文件。使用静态库的可执行文件无需依赖静态库,静态库及时被删除,也可照常运行。执行效率比动态库相对要高。静态库的文件形式为:lib.a原创 2020-08-30 02:11:49 · 4427 阅读 · 4 评论 -
C语言 环境变量配置
环境变量环境变量描述C_INCLUDE_PATH指定头文件的附加搜索路径,相当于gcc的 -I 选项C_PATH指定头文件的附加搜索路径,相当于gcc的 -I 选项LIBRARY_PATH指定库文件的附加搜索路径,相当于gcc的 -L 选项LD_LIBRARY_PATH指定加载共享库的搜索路径配置对于linux来说,在用户目录下的.bash_profile文件在用户每次登录时都会执行该文件,我们需要在.bash_profile文件中使用export来在原创 2020-08-27 21:29:57 · 4424 阅读 · 0 评论 -
C语言 预定义宏
预定义宏描述BASE_FILE正在被编译的源文件名FILE宏所在的文件名LINE宏所在的(逻辑)行号FUNCTION宏所在的函数名func宏所在的函数名,和__FUNCTION__一样DATE宏被预处理器扩展的日期TIME宏被预处理器扩展的时间INCLUDE_LEVEL宏所在文件的包含层数,从0开始__cplusplus只有在C++预处理中有定义,在C预处理中无此定义,可将此定义有无用于判断是否为C++编译器编译...原创 2020-08-27 02:30:53 · 914 阅读 · 0 评论