linux
文章平均质量分 62
知无止境
这个作者很懒,什么都没留下…
展开
-
ubuntu切换python版本
在ubuntu环境下进行嵌入式开发,我们在进行不同的项目开发时,可能会遇到python环境不统一的情况。这时,我们可以通过update-alternatives来方便更新ubuntu下的python环境,来适应不同的项目工程。原创 2023-01-12 15:34:37 · 11242 阅读 · 1 评论 -
ubuntu下arm-none-eabi-gcc安装
ubuntu下arm-none-eabi-gcc安装原创 2023-01-12 13:47:41 · 2062 阅读 · 0 评论 -
linux下查找命令(find、grep)总结
linux下grep命令使用总结原创 2022-11-03 09:24:14 · 3095 阅读 · 0 评论 -
linux文件和目录函数
一、文件描述符linux系统会为每一个打开的文件分配一个文件描述符(一个非负整数),我们可以使用文件描述符对文件进行一系列的操作。二、文件操作2.1、openopen函数既可以打开已经存在的文件,也可以创建一个新的文件并打开。函数原型:int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);头文件:#include <sys/type原创 2022-03-31 09:28:50 · 354 阅读 · 0 评论 -
ubuntu开机没有ens33解决方法
最近重新安装了VMware,使用之前的ubuntu镜像,发现只有一个lo网卡,没有ens33,虚拟机无法获取ip地址,samba服务器也无法正常使用。root@ubuntu:/var/lib/NetworkManager# ifconfiglo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid原创 2022-03-13 20:01:52 · 5399 阅读 · 6 评论 -
linux环境变量设置方法
一、概述linux系统的用户权限分为超级用户(root)和普通用户,环境变量对应系统级环境变量和用户级环境变量。二、系统级环境变量2.1、/etc/profile此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。这个文件中的环境变量对所有用户有效,包括普通用户和超级用户,但是这个文件通常在重启后并不自动加载,而是需要使用source命令启动。因为我们第一次登录时,通常是以普通用户登录的,并非超级用户。so原创 2022-02-28 14:03:33 · 1352 阅读 · 0 评论 -
linux磁盘和文件空间查看命令
一、df命令1.1、显示文件系统的磁盘情况统计ubuntu@ubuntu:~/Desktop$ df Filesystem 1K-blocks Used Available Use% Mounted onudev 960376 0 960376 0% /devtmpfs 198772 3144 195628 2% /run/dev/sda5 102562776 36965972原创 2022-02-24 15:50:46 · 1584 阅读 · 0 评论 -
linux下常用压缩命令
一、tar命令tar命令用来打包一个目录,它支持三种格式:".tar"、".bz2"和".gz"1.1、压缩tar -cvf [文件名].tar [文件目录] //打包成.tar文件tar -jcvf [文件名].tar.bz2 [文件目录] //打包成.bz2文件tar -zcvf [文件名].tar.gz [文件目录] //打包成.gz文件1.2、解压缩tar -xvf [文件名].tar //解压到当前文件tar -xvf [文件名].tar -C [文件目录] //将.tar文件解原创 2022-02-16 10:44:41 · 135560 阅读 · 0 评论 -
linux安装和使用gdb调试工具
一、安装gdb工具sudo apt-get updatesudo apt-get install gdb 查看gdb版本gdb -vshell终端打印版本信息如下:GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1二、gdb工具的使用方法2.1、编译生成可执行文件 gcc HttpClient.c -o out -g -I ./上面一段命令表示将HttpClient.c编译后生成一个名为out的可执行文件,-I表示头文件路径2.2、开始gdb调试使用g原创 2021-08-11 14:28:36 · 1400 阅读 · 0 评论 -
linux网络编程(getaddrinfo和gethostbyname函数详解)
一、getaddrinfo函数原型: int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);函数功能:根据hints指定的参数要求,获取服务器node的信息,并将获取的结果存储到res中函数参数:node 服务器的域名或者IP地址 service 服务的十进制端口字符串或者协议类型,如“8099”、“http”原创 2021-08-06 16:35:16 · 1744 阅读 · 0 评论 -
树莓派安装和配置samba服务器
安装samba服务器sudo apt-get updatesudo apt-get install samba samba-common-bin创建共享文件夹,更改文件夹权限sudo mkdir /sharesudo chmod -R 777 /share修改samba配置文件,添加共享文件夹的路径和属性sudo vim /etc/samba/smb.conf在文件最后面添加(将后面的注释去掉):# ======================[share] .原创 2021-06-05 14:26:47 · 1153 阅读 · 0 评论 -
树莓派3B+安装Raspberry Pi OS
Raspberry Pi OS是树莓派官方提供的操作系统,它基于debian系统开发,所以又称为raspbian。官方提供了三个版本:Raspberry Pi OS with desktop and recommended softwareRaspberry Pi OS with desktopRaspberry Pi OS Lite第一种版本除了桌面外包含很多预装的软件;第二个版本只含桌面,没有多余的其它软件;第三个版本不包含桌面系统,只能用shell访问和操作。这里我们选择第二个版本进行安装原创 2021-05-30 14:02:23 · 1215 阅读 · 0 评论 -
树莓派3B+ubunt server配置WiFi
基于树莓派的ubuntu server系统默认是没有开启WiFi的,如果想要在ubuntu下使用树莓派的WiFi功能就必须要手动配置。安装iwconfig工具和net-toolssudo apt install wireless-toolssudo apt-get install net-tools启动树莓派的无线网卡,网卡名称默认为wlan0sudo iwconfig wlan0 power onsudo ifconfig wlan0 up配置树莓派需要连接的路由器名称和密码原创 2021-05-28 16:59:41 · 1436 阅读 · 0 评论 -
树莓派3B+安装ubuntu20镜像以及远程访问
树莓派的ubuntu版本主要有ubuntu MATE、ubuntu core、ubuntu server三个版本。ubuntu MATE版本的功能最全,它预装了大部分常用的桌面软件,体积也比较大;ubuntu server不包含图形界面,但是我们可以后续自己根据需求来安装;ubuntu core具有更小的体积,通常用于嵌入式设备。第一步:下载ubuntu镜像和镜像烧录工具镜像地址:ubuntu MATE ubuntu core ubuntu server工具地址:Win32DiskImager更多镜原创 2021-05-28 16:16:51 · 1084 阅读 · 0 评论 -
uboot串口命令cmd代码解析(uboot2012.04.01)
一、uboot命令定义分析1.1、.u_boot_cmd段相信很多人在初次接触uboot都会找不到uboot命令表的定义在哪里,这是因为uboot命令表的起始地址定义在了链接脚本中,而uboot命令表的内容是使用section关键词指定变量到uboot命令表地址的。在u-boot.lds文件中有如下一段代码: __u_boot_cmd_start = .;//.表示当前地址 .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .;这段代码原创 2020-11-27 17:30:47 · 846 阅读 · 0 评论 -
uboot代码流程分析
在分析uboot之前,我们需要执行如下两条指令make make smdk2440_configmake上面两条指令执行完之后,在根目录下会生成一个名为uboot.lds的链接文件,这个脚本记录了uboot的入口,入口函数名为_start,位于arch/arm/cpu/arm920t/start.s文件:ENTRY(_start)SECTIONS{ . = 0x00000000; . = ALIGN(4); .text : { __image_copy_start = .; a原创 2020-11-25 15:42:46 · 221 阅读 · 0 评论 -
uboot之Makefile配置流程分析(uboot2012.04.01)
一、uboot配置方法在拿到uboot源码之后,我们需要做的第一件事就是配置uboot,我们以s3c2440为例:make smdk2440_config在执行这条命令之后,就可以直接使用make进行uboot的编译。二、make smdk2440_config具体做了什么第一步,我们需要在makefile中找到smdk2440_config这条命令,但是直接搜索smdk2440_config会发现,makefile中并没有这个字段,但是在Makefile中存在如下一段脚本:unconfig:原创 2020-11-20 17:02:21 · 352 阅读 · 0 评论 -
arm-linux-gcc4.3.2安装步骤
一、下载arm-linux-gcc安装包这个链接是韦东山配套的4.3.2编译器的链接链接:https://pan.baidu.com/s/1JhvZ8qF-BlnrldPHLiGP5g提取码:d81x二、解压安装包tar xjf arm-linux-gcc-4.3.2.tar.bz2三、将解压后的文件复制到usr/local目录下依次执行以下命令,源文件目录表示解压后的uboot所在的目录cd /sudo sumkdir /usr/local/armcp -r 源文件目录/usr/l原创 2020-11-17 10:53:07 · 1133 阅读 · 0 评论 -
c语言主机字节序和网络字节序
一、什么是字节序字节序是指多字节数据在计算机内存中存储顺序,或者网络传输时各字节的传输顺序,字节序分为大端序和小端序。大端序:高字节存储在低位地址,传输数据时高位在前;小端序:高字节存储在高位地址,传输数据时高位在后;假设0x4001-0x4004地址中存储有一个整型变量0x12345678,它在大端和小端mcu中的存储方式如下:地址大端存储小端存储0x40040x780x120x40030x560x340x40020x340x560x400原创 2020-11-16 13:48:51 · 1399 阅读 · 0 评论 -
linux下网络通信(udp通信协议详解)
一、udp通信简介udp是User Datagram Protocol的简称, 中文名是用户数据报协议。udp协议位于osi模型中的传输层,它是一种面向无连接的协议。udp协议并不保证数据一定能够到达对端,也不能保证数据能够按照顺序到达对端,udp数据的可靠性需要引用层来保证。udp提供的虽然是不可靠的数据传输,但是udp在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序。二、udp通信建立步骤2.1、服务器端1)socket建立套接字,需要指定ip类型和协议类型socke原创 2020-11-04 17:05:20 · 5387 阅读 · 6 评论 -
linux文件系统中i节点和stat函数/命令
一、概述unix系统中,每打开一个文件,内核会使用三种数据结构来表示这个文件:进程表、v节点和i节点。linux只保留了unix中的i节点来维护打开的文件;二、i节点和struct stat结构体linux的i节点信息存储在struct stat结构体中,可以通过man 2 stat来查看这个结构体的内容,如下: struct stat { dev_t st_dev; /* ID of device containing fil原创 2020-10-11 10:49:51 · 972 阅读 · 2 评论 -
解决Ubuntu下sudo su报sudo: /etc/sudoers is world writable的问题
最近在使用linux下执行sudo su之后会报如下错误sudo: /etc/sudoers is world writablesudo: no valid sudoers sources found, quittingsudo: unable to initialize policy plugin出现这种问题的原因在于/etc/sudoers的权限发生了改变;执行 ls -l /etc/sudoers得到的权限为777,这种权限太开放,会有问题,如下:-rwxrwxrwx 1 root ro.原创 2020-09-22 10:38:10 · 5442 阅读 · 2 评论 -
c语言数据结构(单向链表)
一、链表简述链表是c语言常用的一种数据结构,和队列不同的是,链表中存储的数据类型更加多样化,可以是数组、指针或者多种数据类型组合而成的结构体。链表需要一个链表头记录整个链表的起点,之后的节点可以根据链表头进行查找。二、链表基本操作2.1、链表创建在使用链表前需要创建一个存储链表数据的结构体结构体中的数据可以是一个数组、指针或者用户自定义的结构体等。typedef struct _listnode{ struct _listnode *next; char filename[128原创 2020-09-13 10:29:45 · 296 阅读 · 0 评论 -
C语言数据结构(环形缓冲区)
一、什么是环形缓冲区环形缓冲区本质上也是环形队列,和环形对列不同的是,环形缓冲区允许用户一次性写入和读取多个队列元素;二、对环形缓冲区的简单理解我们可以把环形缓冲区想象成一个蓄水池,它有一个入水口和出水口,如果入水的速度大于出水的速度,在一段时间后蓄水池就会存满水,这时即使关闭入水口,出水口还是会源源不断的有水流出。图片来源于百度图片二、环形缓冲区的应用环形缓冲区通常应用于具有生产者和消费者的场景,比如我们需要实现一首音乐的在线播放,假设一首音乐的大小为5M,在带宽充足的情况下下载完原创 2020-09-11 09:17:55 · 2297 阅读 · 1 评论 -
linux下进程通信(信号量)
一、信号量的工作原理使用过freertos的应该都知道,信号量其实就是一个计数值,线程发送信号量,实际上是将信号量的计数值加一,线程接收信号量实际上是将信号量的值减一。linux下的信号量其实也是一个计数值,通过semop函数可以将信号量的值进行加一或者减一操作。我们可以想象一个盒子里有n个苹果,每被人拿走一个,盒子里的苹果就会减少一个,当n个苹果全部被拿走之后,我们就只能等待其它人往盒子里放入新的苹果。盒子里的苹果其实就是一个共享资源,当共享资源被耗尽的时候,需要获得共享资源的线程就会挂起并等待,知原创 2020-08-27 16:33:28 · 229 阅读 · 0 评论 -
linux下进程通信(消息队列)
一、消息队列创建和使用流程使用ftok创建一个key使用msgget创建或者打开一个消息队列使用msgsnd发送消息使用msgrcv接收消息使用msgctl获取、修改或者删除消息队列二、消息队列函数2.1、ftok函数函数原型:key_t ftok(const char *pathname, int proj_id);函数功能:使用一个已经存在的文件名和实际只有8为的proj_id创建一个key;2.2、msgget函数函数原型:int msgget(key_t key,原创 2020-08-25 13:53:09 · 263 阅读 · 0 评论 -
linux下IPC标识符和键(ftok函数)
一、标识符和键每个内核中的IPC(InterProcess Communication)结构都用一个非负整数的标识符加以引用。这个标识符的作用和文件描述符类似,但与文件描述符不同的是,标识符每次创建然后又被删除时它的值都会加一,直到达到一个整数的最大值然后从0开始继续循环。标识符是是IPC对象内部的命名,对外不可见,我们在做进程通信时需要创建一个键(key_t),这个键和标识符是绑定的,我们可以使用这个键进行进程间通信;linux下信号量、消息队列和共享存储器在使用时都必须制定一个键值;二、使用原创 2020-08-22 19:49:02 · 526 阅读 · 0 评论 -
linux下wait、waitpid和waitid的用法
1.函数原型#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *wstatus);pid_t waitpid(pid_t pid, int *wstatus, int options);int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);2.wait函数wait函数会一直处于阻塞状态,直到有一个子进程退出,并返回退出子进原创 2020-08-21 22:42:01 · 1700 阅读 · 0 评论 -
linux下exec函数族
一、exec函数族1.1、exec函数族相关函数#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ... /* (char *) NULL */);int execlp(const char *file, const char *arg, ... /* (char *)原创 2020-08-19 20:19:10 · 150 阅读 · 0 评论 -
linux下使用clone创建进程
一、clone函数1.1、函数原型int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ... /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );头文件:#define _GNU_SOURCE#include <sched.h>函数作用:clone函数允许用户指定子进程继承或者拷贝父进程的某些特定资源,如信号量、文件描述符、文件系统、内原创 2020-08-16 21:38:37 · 3306 阅读 · 0 评论 -
linux下使用fork和vfork创建子进程
一、使用fork创建子进程1.1、函数原型函数原型:pid_t fork(void);头文件: #include <sys/types.h> #include <unistd.h>返回值:成功返回0或子进程的pid1.2、fork创建的子进程和父进程之间的关系1)子进程是父进程的拷贝,调用fork函数后,系统会为子进程拷贝fork之前父进程拥有的资源;2)使用fork创建的子进程和父进程运行在不同的地址空间;3) 子进程不继承父进程的内存锁、信号量原创 2020-08-16 13:10:14 · 833 阅读 · 1 评论 -
ubuntu下使用ps查看进程信息
一、ps常用命令组合ps 查看当前终端下运行的所有进程信息ps aux 查看linux下所有的进程信息ps -aux 查看linux下用户名为x所拥有的进程信息,如ps -auname表示查看linux下用户名为name所拥有的进程信息其它选项a 列出所有含有终端的进程u 列出当前用户的所有含有终端的进程,并显示进程的用户信息x 列出当前用户的所有进程信息e 显示环境变量-L显示当前用户的线程信息,如ps -L二、在进程中搜索某个特定进程格式:ps [选项] | grep [原创 2020-08-14 21:22:28 · 5394 阅读 · 0 评论 -
linux进程和线程的区别与联系
一、linux进程1、父进程和子进程 1)父进程和子进程的关系[1] 子进程由fork函数创建,fork函数调用一次,返回2次,其中子进程的返回值是0,父进程的返回值是子进程的pid;[2] 父进程和子进程共享代码空间、堆栈,但是数据空间是独立的。即改变子进程中的局部变量和全局变量的值并不影响父进程中对应变量的内容,反过来也成立。 2)父进程和子进程的执行顺序父进程和子进程的执行顺序是不确定的2、僵尸进程 1)僵尸进程的产生如果子进程比父进程先退出,并且父进程没有回收子进程的资源原创 2020-08-12 19:33:43 · 487 阅读 · 0 评论 -
linux下使用select函数创建单线程tcp服务器
一、select函数1.1、select函数的作用select函数允许程序监听多个文件描述符,直到其中一个文件描述符处于就绪状态(有数据可读或可写)。函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);头文件: #include <sys/select.h> #include <sys/time.h>原创 2020-08-08 10:03:06 · 364 阅读 · 0 评论 -
linux下网络编程(TCP连接的建立)
一、TCP服务器和客户端的创建tcp服务器和客户端的创建流程如下图:服务器端socket指定套接字的协议类型,是ipv4还是ipv6,是tcp还是udp;bind将socket套接字和服务器地址绑定;listen用于开启服务器的监听功能;accept用于接收新的客户端的连接,每接收到一个新的客户端,accept都会为其创建一个新的唯一的套接字,并记录客户端的地址;recv和send在有客户端连接的情况下使用;close关闭指定的套接字对应的客户端的连接;客户端socket指定套原创 2020-08-03 20:40:28 · 1307 阅读 · 0 评论 -
linux线程通信和同步(读写锁)
一、读写锁读写锁和互斥锁的区别读写锁和互斥锁都可以解决多线程在访问共享资源竞争的问题,不同的是读写锁允许多个线程同时读某个共享变量,在同一时刻只允许一个线程对变量进行写操作,因此读写锁的效率要高于互斥锁。读写锁是几把锁读写锁其实是一把锁,但是这把锁拥有读和写两种属性;读写锁的状态读写锁存在三种状态:写加锁,此时其它任何试图获取读锁或写锁的线程都将被阻塞,这种属性称为写独占;读加锁,此时其它任何试图获取读锁的线程都可以加锁成功,这种属性被称为读共享;读加锁,此时如果既有线程试图获取读原创 2020-08-01 13:27:56 · 224 阅读 · 0 评论 -
linux线程属性(分离属性和调度策略)
一、线程分离属性线程的分离属性有两种:分离态(detached)和非分离态(joinable)。非分离态的线程只有在调用pthread_join之后才会完全释放自己所占用的资源,可以用pthread_detach函数将线程修改为分离态,分离态的线程在线程结束后由系统自动释放其所占用的所有资源;线程创建后默认属性是非分离态,需要调用pthread_join释放线程所占用的资源;二、线程的栈大小线程的栈空间可以使用pthread_attr_setstacksize函数设置三、线程的栈地址原创 2020-07-28 21:53:06 · 1592 阅读 · 0 评论 -
linux线程通信和同步(信号量)
一、信号量和条件变量的异同信号量和条件变量都可以允许多个线程以无竞争的方式等待特定条件或信号的产生;信号量在使用时会设置一个初始值,每次只能唤醒一个正在等待信号的线程,而条件变量则没有初始值,并且可以一次性唤醒所有等待条件变量的线程;条件变量一般和互斥锁一起使用,这一点比信号量稍微麻烦一些;二、信号量使用注意事项如果信号量的初始值不为0,那么即使不调用sem_post,使用sem_wait的线程依然可以被唤醒,直到信号量的值为0;每一次调用sem_post,信号量的值都会被加一,每一次调用原创 2020-07-26 10:21:01 · 359 阅读 · 0 评论 -
linux线程通信和同步(私有数据)
一、如何在线程中创建私有数据通过pthread_key_create函数可以在线程中创建私有数据,同一个key值在不同的线程中绑定的内存地址不同,线程结束绑定关系也随之终止,在线程中分配的键值对应的内存需要在析构函数中主动释放。私有数据和使用malloc在线程中开辟空间的方式很类似,区别在于malloc分配的内存需要在线程中单独释放,而私有数据则在析构函数中统一释放。二、常用函数1.pthread_key_create函数原型:int pthread_key_create(pthread_ke原创 2020-07-21 20:21:24 · 103 阅读 · 0 评论 -
lilinux线程间通信和同步(自旋锁和互斥锁)
一、自旋锁和互斥锁的异同1.1、自旋锁[1]当一个线程在获取锁的时候,如果其它线程已经获取了锁,那么该线程会不停的尝试去获取锁,在此期间它会占用cpu的资源;[2]使用自旋锁不会导致进程和线程的切换,所以适用于时间很短的情况。[3]自旋锁可以在多进程中使用,通过pthread_spin_init的第二个参数设置。2.2、互斥锁[1] 当一个线程在获取锁的时候,如果其它线程已经获取了锁,那么该线程会不停的尝试去获取锁,在此期间它会释放cpu的资源(进入休眠);[2]当线程A试图获取互斥锁,原创 2020-07-20 19:52:41 · 351 阅读 · 0 评论