Linux
Linux
Worthy_Wang
一辈子没办法做太多事情,所以每一件都要做到精彩绝伦。
展开
-
Linux 事件触发器eventfd的使用以及C++封装
文章目录前言:为什么需要eventfd?eventfd 设计原理eventfd测试用例C++ 封装eventfd前言:为什么需要eventfd?在我们之前的学习中,进行进程/线程间通信的方法有两个:条件变量需要使用锁,线程的互斥,唤醒等机制,使用此方法来进行通信实在是很麻烦;管道管道的特点在于传送信息,并且会产生两个文件描述符,也是同样的麻烦。于是乎,eventfd便产生了,通过同一个文件描述符,能够快速的进行进程/线程间的通信。eventfd 设计原理其实简单一点看eve原创 2020-07-10 20:39:31 · 1412 阅读 · 0 评论 -
Linux 定时器timerfd的使用与C++封装
文章目录前言:为什么需要定时器timerfd?timerfd 设计原理timerfd 测试用例C++封装timerfd前言:为什么需要定时器timerfd?在多线程中,设置一个超时时间,当时间超时时,就会触发事件,这样的操作如果是我们自己做,那么需要使用到<time.h> 和 <sys/time.h> 中的API进行不断地更新时间,再判断有没有超时,如果超时再找到对应的触发事件。这样的操作很复杂,而且在多线程中容易出错,所以便有了timerfd.timerfd 设计原理原创 2020-07-10 20:10:57 · 1003 阅读 · 0 评论 -
Linux 多线程Posix详解(三) : C++封装
C++封装MutexLock,MutexLockGuard,Condition题目要求:设置两个消费者型线程,进行交替消费,不考虑存货为什么要使用MutexLockGuard?在生成MutexLockGuard类对象之后,自动加锁,然后在语句块中执行完毕,调用析构函数的时候自动解锁,这样自动加解锁,避免了死锁的可能Mutex.h:#ifndef _WD_MTUTEX_H_#defin...原创 2020-02-28 15:09:34 · 285 阅读 · 0 评论 -
Socket网络编程:TCP连接与UDP连接
文章目录socket编程概述一.TCP通信服务端详细流程客户端详细流程案例:服务端与客户端进行TCP通信二.UDP通信socket编程概述Linux网络编程实质上就是socket编程,IP地址可以确定一个主机,端口号可以确定主机中的一个进程,socket = IP + port(端口号)这样便确定了主机中运行的进程,网络通信实质上就是进程通信。我们知道连接分为两种,可靠的TCP连接与不可靠的UDP连接,下面分别通过这两种连接来熟悉socket编程.一.TCP通信服务端:socket ->原创 2020-06-03 18:34:41 · 729 阅读 · 0 评论 -
Linux网络编程:主机字节序 与 网络字节序
网络字节序 与 主机字节序文章目录网络字节序 与 主机字节序前言字节序转化1.主机字节序 ——> 网络字节序2.网络字节序 ——> 主机字节序域名转换IP地址前言首先需要理解 大端模式 与 小端模式这两个点:这两种模式代表着数据在内存中是如何存放的,我们直到,一个字节能够存放8位,如果是超过8位的数据该怎样存放呢?如需要存放数据 0x12345678大端模式存放:0x12345678小端模式存放: 0x78563412不难看出,大端模式也就是高位优先存放,小端模式也就是低位原创 2020-06-03 16:54:40 · 378 阅读 · 0 评论 -
Linux IPC进程间通信(三):信号量
文章目录前言信号量的使用信号量的用法一:互斥锁信号量的用法二 : 计数信号量此篇文章参考于:Linux系统编程—信号量前言信号量的使用方法与 共享内存,消息队列均不同,后者是主要方便进程间通信,而信号量的作用是 对共享资源的互斥访问当信号量的资源数量 <= 0 时,则会阻塞,直到资源数量 >0 时才开始进行操作,另外信号量的操作均为原子操作。信号量的主要两种用法(根据信号量初始资源数量的不同, 或者说有没有利用到信号量的资源值):互斥锁(信号量的初始值为1)可以将信号量的资源原创 2020-05-25 09:07:06 · 1063 阅读 · 0 评论 -
Linux IPC进程间通信(四):消息队列
Linux IPC进程间通信系列文章:Linux IPC进程间通信(一):管道Linux IPC进程间通信(二):共享内存Linux IPC进程间通信(三):信号量Linux IPC进程间通信(四):消息队列文章目录前言消息队列的使用案例一 :亲属进程间的通信本篇文章参考于:Linux系统编程—消息队列前言消息队列的用法与之前几篇进程同行的方法类似,也是基本相同的使用方法。我们通常会使用 ipcs 命令来查看消息队列的使用:消息队列的使用int msgget(key_t ke原创 2020-05-25 09:08:03 · 382 阅读 · 0 评论 -
Linux IPC进程间通信(二):共享内存
文章目录共享内存案例一:亲属进程间通信案例二:非亲属进程通信共享内存key_t ftok(const char* filename, int proj_id)通过已经存在的文件(filename) 与 proj_id(通常大于0) 创建出一个key值,用于进行共享内存的生成。int shmget(key_t key, size_t size, int shmflag)key代表着与共享内存相关的一个关键字,如果该关键字已经存在,那么直接打开该共享内存,反之创建共享内存(一般使用 IPC_P原创 2020-05-25 09:06:58 · 386 阅读 · 0 评论 -
函数库 time.h,sys/time.h 关于时间的用法
C函数库<time.h>时间的用法一. struct tm*使用时间最重要的结构体就是掌握struct tm*的用法在这个结构体中有年月日时分秒,掌握了这个结构体之后我们就可以输出时间。void test0(){ time_t rawtime; time(&rawtime); struct tm *timeinfo = localtime(&rawtime); cout << timeinfo->tm_year + 1原创 2020-05-18 13:22:12 · 4915 阅读 · 0 评论 -
Linux IPC进程间通信(一):管道
文章目录前言一.标准管道流二.无名管道三.命名管道前言Linux进程间通信(IPC)的一个重要方法就是管道,在学习管道之前,要理解两个概念半双工(读端与写端必须固定)全双工(读端与写端不固定)不论是无名管道还是有名管道,都属于半双工管道,理解这一点非常重要。一.标准管道流FILE *popen(const char *__command, const char *__modes)command 代表shell指令modes 分为 "r"读 和 "w"写具体功能和Linux命令中的原创 2020-05-18 17:58:10 · 289 阅读 · 0 评论 -
Linux IO多路复用模型 : select epoll
文章目录前言:为什么要使用IO多路转接模型?IO多路转接模型实例 :两个文件句柄,同时对pipe文件进行读取和写入前言:为什么要使用IO多路转接模型?试想一下,如果A想接收B的消息,那么A就需要创建一个进程(或线程),用while(1)循环一直监视B是否给A发来消息,同时B也一直需要监视A,这会让系统的开销变得很大。IO多路转接模型的函数select, 可以帮助我们同时监视多个文件句柄, 这样极大地降低了 内存 与 CPU 的开销。IO多路转接模型int select(int maxFd, f原创 2020-05-18 17:10:38 · 187 阅读 · 0 评论 -
Linux mmap内存映射,文件空洞详解
文章目录前言:为什么要使用mmap内存映射?mmap内存映射案例1:共享内存设计案例2:父子进程的进程间通信前言:为什么要使用mmap内存映射?我们知道,CPU从 I/O设备 读写的速度非常慢,而从 内存 读写的速度非常快,如果对一个文件需要进行多次读写,那么每一次都调用 I/O读写操作时很不划算的,于是我们便将这个文件 映射 到内存中,这样CPU就可以直接快速读写。mmap内存映射是一种空间换时间的思想。mmap内存映射void* mmap(void* addr, size_t len,原创 2020-05-18 16:35:08 · 471 阅读 · 1 评论 -
Linux进程详解(多进程、孤儿、僵尸、守护进程实现)
文章目录前言一.进程标识二.多进程的创建三.孤儿进程四.僵尸进程五.守护进程前言程序是静态的,进程是动态的,我们将进程运行起来后,能够通过一些linux指令 如 top , ps 等,来查看进程的动态。一.进程标识getpid() 获取本进程的idgetppid() 获取父进程idgetuid() 获取user(使用者)idvoid test0(){ cout << "本进程ID:" << getpid() << endl; cout原创 2020-05-18 16:26:25 · 235 阅读 · 0 评论 -
Linux 系统日志syslog详解
Linux 系统日志前言日志系统记录了我们在系统中用过了哪些操作,并且将其保存在一个文件中,方便之后我们对进行过的操作进行查看。linux日志日志存放在 /var/log/syslog 文件中头文件:#include <syslog.h>void syslog(int priority, const char* msg);调用syslog函数之后自动向 /var/log/syslog 文件中进行输出。int main(){ syslog(LOG_DEBUG, "t原创 2020-05-18 15:42:02 · 2167 阅读 · 0 评论 -
Linux ls -l命令 C++实现
前言ls命令是我们在进行linux操作中经常用到的一个命令,在设计文件服务器的时候,我们需要了解到ls 的底层实现。实现程序:#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <time.h>#include <string.h>#include <dirent.h>#include <iostream>#in原创 2020-05-18 14:06:01 · 426 阅读 · 0 评论 -
Linux 文件系统操作详解:目录操作与文件操作(实战:tree命令实现)
文章目录一.目录操作1.获取、改变、创建、删除当前目录2.打开目录流、读取目录流、关闭目录流3.读取文件的类型,大小, 最近访问时间等4.综合练习:实现 tree 命令二.文件操作1.打开关闭文件2.读取,写入文件3. 改变文件大小4.文件定位 与 文件空洞设计5.文件描述符的复制6.标准输入、输出、错误输出一.目录操作1.获取、改变、创建、删除当前目录char* getcwd(char*, size_t)int chdir(char*, mode_t)创建和删除目录int mkdir(c原创 2020-05-18 13:59:08 · 377 阅读 · 0 评论 -
Linux 动态库与静态库详解
动态库与静态库文章目录动态库与静态库前言一.动态库二.静态库这篇文章参考于教程:http://c.biancheng.net/view/2385.html我将其精炼总结后写出以下文章。前言为什么要使用动态库与静态库?因为在某些情况下,我们可能并不想公开源码,那么我们就将写好的函数编译成二进制文件,再放入到系统库中,这样一来,别人就只能调用我们写好的函数而无法窥视我们的源码。动态库于静态库的区别:动态库静态库加载程序运行时加载,不写入程序中,程序会较小在链接.o文件时原创 2020-05-13 10:59:35 · 259 阅读 · 0 评论 -
腾讯云Ubuntu18.04 使用并添加新用户
双链表 C语言实现DLinkList.h:#pragma once#include <stdio.h>#include <stdlib.h>typedef char ElemType;typedef struct Node{ ElemType data; struct Node *prior; struct Node *next;}Node, *Lin...原创 2020-04-16 11:28:31 · 1034 阅读 · 0 评论 -
Linux 多线程Posix详解(二) : 线程的同步与互斥
int pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr)int pthread_mutex_lock(pthread_mutex_t *__mutex)int pthread_mutex_unlock(pthread_mutex_t *__mutex) throw()int...原创 2020-02-25 11:24:32 · 291 阅读 · 0 评论 -
Linux 多线程Posix详解(一) : 线程的创建、等待、退出、取消与清理
多线程int pthread_join(pthread_t __th, void **__thread_return)int pthread_create(pthread_t *restrict __newthread, const pthread_attr_t *restrict __attr, void (__start_routine)(void *), void *restrict ...原创 2020-02-24 15:35:09 · 576 阅读 · 0 评论 -
signal与raise
signal函数signal函数:void (*signal)(int SIGINT, void (*signalHander)(int) )SIGINT表示的时接受到的信号的序号,如ctrl+c的信号是2;signalHander则是进行信号处理的函数,传入的参数int则是接受到的信号值,如ctrl+c的信号是2;signal函数总结:1.首先在使用signal函数之前,需要加上...原创 2020-02-23 13:17:34 · 452 阅读 · 0 评论 -
Linux环境下makefile文件的使用
Linux环境下makefile文件的使用前言先来看源程序:main.cpp:#include "Head.h"#include <iostream>using namespace std;int main(){ cout << "HelloWorld in main()" << endl; print(); retu...原创 2020-02-20 10:58:50 · 635 阅读 · 0 评论 -
Linux环境下源文件到可执行文件:预编译->编译->汇编->链接
Linux环境下源文件到可执行文件:预编译->编译->汇编->链接前言在使用编译器对C/C++源文件进行编译的过程分为了:预编译编译汇编链接一.预编译预编译的任务是将像#define , #include这样的宏定义于头文件进行解释。#include "Head.h"就是将Head.h文件的内容提前全部加载到预编译文件中,#define MAX 65532也...原创 2020-02-19 14:18:27 · 281 阅读 · 0 评论 -
硬链接与软链接
硬链接与软链接使用linux中的文件系统来演示软链接与硬链接。硬链接linux的文件系统存放着很多节点,在我们创建了file文件(指向节点是1062772),再将file1文件硬链接到file文件时,实质上是将file1文件也指向了1062772节点,当只有指向1062772节点的文件全部都删除的时候,也就是file1和file2都删除的时候,这个节点才会释放。总的来说,硬链接的原理类...原创 2020-02-15 15:51:24 · 134 阅读 · 0 评论