Linux常用命令之envsubst

https://blog.csdn.net/banche163/article/details/101369495

Linux中的EAGAIN含义

https://blog.csdn.net/memo_weiwei/article/details/7691226

Linux中的虚拟设备/dev/null、/dev/zero、/dev/random和/dev/urandom

https://blog.csdn.net/sinat_26058371/article/details/86754683

修改系统时间,同步网络时间,修改时区:

https://www.cnblogs.com/suiyueshentou/p/7798340.html

https://my.oschina.net/qiongtaoli/blog/2051844

VMware虚拟机 Linux系统 Ubuntu 16.04 硬盘/磁盘扩容:

https://blog.csdn.net/m0_43403238/article/details/85480314?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

Clion on Ubuntu14.04, 无法使用Navigate中的Back命令的快捷键Ctrl+Alt+Left

https://segmentfault.com/q/1010000005040615

Linux 命令神器:lsof

https://www.jianshu.com/p/a3aa6b01b2e1

产生core文件:  ulimit -c unlimited   

基于gdb调试:gdb xx(如media-agent这是编译后的可执行文件) core,进入调试状态

         gdb bt  可以看到比如coredump报错出现的问题,比如空指针,野指针,内存泄露

       gdb f 1/2/3/4...

       

 nohup 后台运行,进程查看以及终止https://www.cnblogs.com/baby123/p/6477429.html

Linux MemFree与MemAvailable的区别

https://blog.51cto.com/xujpxm/1961072

linux命令行/shell 查看实时网速

LANG=""
while true
do
up_time1=`ifconfig $1 | grep "bytes" | awk '{print $6}'`
down_time1=`ifconfig $1 | grep "bytes" | awk '{print $2}'` sleep 1
clear up_time2=`ifconfig $1 | grep "bytes" | awk '{print $6}'`
down_time2=`ifconfig $1 | grep "bytes" | awk '{print $2}'` up_time1=${up_time1}
up_time2=${up_time2}
down_time1=${down_time1}
down_time2=${down_time2} up_time=`expr $up_time2 - $up_time1`
down_time=`expr $down_time2 - $down_time1`
up_time=`expr $up_time / 1024`
down_time=`expr $down_time / 1024` echo 上传速度: $up_time kb/s
echo 下载速度: $down_time kb/s
done

Linux shell中2>&1的含义解释

https://blog.csdn.net/zhaominpro/article/details/82630528

deb格式

安装:

1、打开终端,执行命令:cd 文件所在目录,然后sudo dpkg -i 文件名.deb
2、执行命令:code(即文件名)然后文件就打开了,再然后右击图标锁定任务栏就可以了

卸载:

cd 文件目录,然后 dpkg -r 文件名.deb

打包成tar.gz格式压缩包

# tar -zcvf renwolesshel.tar.gz /renwolesshel

解压tar.gz格式压缩包

# tar zxvf renwolesshel.tar.gz

Linux下C语言串口通信

https://blog.csdn.net/continue_862/article/details/79919028

最近在做一个GPS项目,第一部分是将开发板和GPS用串口通信,接受GPS上传来的数据。

Linux下所有的设备都是以文件形式存储的,串口也是。

整个串口通信的流程图为:

所用到的头文件为:

#include <stdio.h>
#include <fcntl.h>
#include <assert.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <errno.h>
用到了两个全局变量: static int fd;
static int ret; 所需要的函数为: int uart_open(int fd,const char *pathname);
int uart_config(int fd,int baude,int c_flow, int bits, char parity, int stop);
int safe_read(int fd, char *vptr, size_t len);
int uart_read(int fd, char *r_buf, size_t lenth);//串口读取数据
int uart_close(int fd);
打开串口: int uart_open()
{
assert(pathname);//检测串口路径是否存在
fd = open(pathname,O_RDWR|O_NTCCY|O_NDELAY);//以只读形式、不将此终端作为此进程的终端控制器、非阻塞的形式打开串口
if(fd == -1)
{
perror("uart open failed!");
return -1;
}
if(fcntl(fd,F_SETFL,0)<0)//设置串口非阻塞,因为这里是以非阻塞形式打开的,所以第三个参数为0,后面会详细介绍fcntl函数
{
perror("fcntl failed!");
return -1;
}
return fd;
}
配置串口: 配置串口非常重要,这里我做了一个配置串口函数的流程图 配置串口,就是设给termios结构体内的数据赋值,下面科普一下termios结构体 最小的termios结构体如下:
struct termios{
tcflag_t c_iflag;//输入模式
tcflag_t c_oflag;//输出模式
tcflag_t c_cflag;//控制模式
tcflag_t c_lflag;//本地模式(也叫局部模式)
cc_t c_cc[NCCS];//控制字符特性
}
输入模式和输出模式都比较好理解,这里介绍一下控制模式和本地模式
控制模式:主要用于控制终端设备的硬件设置。如:波特率,奇偶校验位,数据位,停止位,数据流控制等。
本地模式:主要用来控制终端设备不同的特色。如:回显的各种方式,是否允许特殊字符,禁止刷新等。
c_cc数组:特殊控制字元可提供使用者设定一些特殊的功能。
         比如这里我们用到的c_cc[VTIME]设置等待时间,c_cc[VMIN]设置最小接受字符 用到的有关termios的函数:
int tcgetattr(int fd, struct termios &termios_p);//用于获取termios结构体属性。成功返回0,失败返回非0
int tcsetattr(int fd, int actions, const struct termios *termios_p);//用于激活termios结构体配置 int fcntl(int fd, int cmd, long arg);//用来操作文件描述词的一些特性
返回值:成功返回0,失败返回-1,失败原因存入errno
cmd有许多参数,可参考C函数库,这里用到的F_SETFL是设置文件描述词状态旗标,参数arg为新旗标 int tcflush(int fd, int queue_selector);//用于清空输入、输出缓冲区
//queue_selector有三种取值 TCIFLUSH(用于清空输入缓冲区) TCOFLUSH(用于清空输出缓冲区) TCIOFLUSH(用于清空输入输出缓冲区) 串口配置的函数代码: int uart_config(int fd,int baude,int c_flow, int bits, char parity, int stop);
int uart_config(int fd,int baude,int c_flow, int bits, char parity, int stop)
{
struct termios uart;
if(tcgetattr(fd,&uart)!=0)
{
perror("tcgetattr failed!");
return -1;
}
switch(baude)
{
case 4800:
cfsetispeed(&uart,B4800);//设置输入波特率
cfsetospeed(&uart,B4800);//设置输出波特率
break;
case 9600:
cfsetispeed(&uart,B9600);
cfsetospeed(&uart,B9600);
break;
case 19200:
cfsetispeed(&uart,B19200);
cfsetospeed(&uart,B19200);
break;
case 38400:
cfsetispeed(&uart,B38400);
cfsetospeed(&uart,B38400);
break;
default:
fprintf(stderr,"Unknown baude!");
return -1;
}
switch(c_flow)
{
case 'N':
case 'n':
uart.c_cflag &= ~CRTSCTS;//不进行硬件流控制
break;
case 'H':
case 'h':
uart.c_cflag |= CRTSCTS;//进行硬件流控制
break;
case 'S':
case 's':
uart.c_cflag |= (IXON | IXOFF | IXANY);//进行软件流控制
break;
default:
fprintf(stderr,"Unknown c_cflag");
return -1;
} switch(bits)
{
case 5:
uart.c_cflag &= ~CSIZE;//屏蔽其他标志位
uart.c_cflag |= CS5;//数据位为5位
break;
case 6:
uart.c_cflag &= ~CSIZE;
uart.c_cflag |= CS6;
break;
case 7:
uart.c_cflag &= ~CSIZE;
uart.c_cflag |= CS7;
break;
case 8:
uart.c_cflag &= ~CSIZE;
uart.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unknown bits!");
return -1;
}
switch(parity)
{
case 'n':
case 'N':
uart.c_cflag &= ~PARENB;//PARENB:产生奇偶校验
uart.c_cflag &= ~INPCK;//INPCK:使奇偶校验起作用
break;
case 's':
case 'S':
uart.c_cflag &= ~PARENB;
uart.c_cflag &= ~CSTOPB;//使用两位停止位
break;
case 'o':
case 'O':
uart.c_cflag |= PARENB;
uart.c_cflag |= PARODD;//使用奇校验
uart.c_cflag |= INPCK;
uart.c_cflag |= ISTRIP;//使字符串剥离第八个字符,即校验位
break;
case 'e':
case 'E':
uart.c_cflag |= PARENB;
uart.c_cflag &= ~PARODD;//非奇校验,即偶校验
uart.c_cflag |= INPCK;
uart.c_cflag |= ISTRIP;
break;
default:
fprintf(stderr,"Unknown parity!\n");
return -1;
}
switch(stop)
{
case 1:
uart.c_cflag &= ~CSTOPB;//CSTOPB:使用两位停止位
break;
case 2:
uart.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unknown stop!\n");
return -1;
}
uart.c_oflag &= ~OPOST;//OPOST:表示数据经过处理后输出 if(tcsetattr(fd,TCSANOW,&uart)<0)//激活配置,失败返回-1
{
return -1;
}
uart.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG );//使串口工作在原始模式下
uart.c_cc[VTIME] = 0;//设置等待时间为0
uart.c_cc[VMIN] = 1;//设置最小接受字符为1
tcflush(fd,TCIFLUSH);//清空输入缓冲区
if(tcsetattr(fd,TCSANOW,&uart)<0)//激活配置
{
perror("tcgetattr failed!");
return -1;
}
return 0;
} 接下来是安全读(防止内存溢出) 代码如下: int safe_read(int fd, char *vptr, size_t len)
{
size_t left;
left = len;
ssize_t nread;
char *ptr;
ptr = vptr;
while(left > 0)
{
if ((nread = read(fd, ptr, left)) < 0)
{
if (errno == EINIR)
{
nread = 0;
}
else if(nread == 0)
{
break;
}
}
left -= nread;//read成功后,剩余要读取的字节自减
ptr += nread;//指针向后移,避免后读到的字符覆盖先读到的字符
}
return (len - left);
}
然后是串口的读,这里主要是设置多路I/O,用到select函数 int uart_read(int fd, char *r_buf, size_t lenth);
int uart_read(int fd, char *r_buf, size_t lenth)
{
fd_set rfds;
struct timeval time;
ssize_t cnt = 0;
/*将读文件描述符加入描述符集合*/
FD_ZERO(&rfds);
FD_SET(fd,&rfds);
/*设置超时为15s*/
time.tv_sec = 15;
time.tv_usec = 0;
/*实现多路IO*/
ret = select(fd+1, &rfds ,NULL, NULL, &time);
switch (ret) {
case -1:
fprintf(stderr,"select error!\n");
break;
case 0:
fprintf(stderr, "time over!\n");
break;
default:
cnt = safe_read(fd, r_rbuf, lenth);
if(cnt == -1)
{
fprintf(stderr, "safe read failed!\n");
return -1;
}
return cnt;
}
} 最后一个函数是串口的关闭 int uart_close(int fd);
int uart_close(int fd)
{
assert(fd);//assert先检查文件描述符是否存在
close(fd);
return 0;
} 最后是main函数 int main()
{
char r_buf[1024];
bzero(r_buf,1024);
fd = uart_open(fd, "/dev/ttyS1");//选择的是ttsY1串口
if(fd == -1)
{
fprintf(stderr,"open failed!\n");
exit(EXIT_FAILURE);
}
if(uart_config(fd,4800,'N',8,'N',1) == -1)
{
fprintf(stderr,"configure failed!\n");
exit(EXIT_FAILURE);
}
while (1) {
ret = uart_read(fd,r_buf,1024);
if(ret == -1)
{
fprintf(stderr, "uart_read failed!\n");
exit(EXIT_FAILURE);
}
printf("buf:%s \n", r_buf);
}
ret = close(fd);
if(ret == -1)
{
fprintf(stderr, "close failed!\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} arm-linux-gcc编译后,下载到开发板上运行,开发板连接GPS,所读到的数据:

linux-日常工作积累的更多相关文章

  1. linux日常使用指令总结

    linux 日常指令总结(ubuntu): ls -lha 所有文件及权限 df -h 系统磁盘空间 du -sh 当前目录大小 du -ah --max-depth=1 显示目录下所有的文件和文件夹 ...

  2. 数据科学工作者(Data Scientist) 的日常工作内容包括什么

    数据科学工作者(Data Scientist) 的日常工作内容包括什么 众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容 ...

  3. 【CentOS】Linux日常管理

    /////////////////////////目录///////////////////////////////////////// 一.日常监控指标相关 1.监控系统状态命令 2.查看系统进程 ...

  4. DBA日常工作内容和职责

    1.统计数据库总容量 按表空间分别统计: 总容量(单位为M): 2.计算用户下所有对象大小 3计算USERS表空间的大小 4计算该USERS表空间对象大小 ---------------------- ...

  5. Linux日常使用指令大全

    Linux日常使用指令大全 Java代码 www.ahlinux.com 001.日常维护常用查询命令 #top    显示系统进程 #clear  清理屏幕信息 #cat /etc/redhat-r ...

  6. Linux操作系统工作的基础

    简介: 本文根据 Linux™ 系统工作基础的分析,对存储程序计算机.堆栈(函数调用堆栈)机制和中断机制进行概述.文中将为您提供操作系统(内核)如何工作的细节,进一步从宏观概述结合关键点进行微观(CS ...

  7. 浅析Linux操作系统工作的基础

    环境:lubuntu 13.04   kernel 3.9.7 作者:SA12226265 katao 简介: 本文根据 Linux™ 系统工作基础的分析,对存储程序计算机.堆栈(函数调用堆栈)机制和 ...

  8. Linux Kbuild工作原理分析(以DVSDK生成PowerVR显卡内核模块为例)

    一.引文 前篇博文<Makefile之Linux内核模块的Makefile写法分析>,介绍了Linux编译生成内核驱动模块的Makefile的写法,但最近在DVSDK下使用Linux2.6 ...

  9. Linux显示工作路径

    Linux显示工作路径 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ pwd /home/youhaidong

  10. 转摘Linux命令工作中常用总结

    Linux命令工作中常用总结   1. 搜索 在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜索定位: 在vi和vim界面中输入:"/" ...

随机推荐

  1. Android Compose的Window Insets

    Android Compose的Window Insets 除了app的内容区域外, 还有一些其他的固定元素会显示在手机屏幕上, 顶部的状态栏, 刘海, 底部的导航栏, 还有输入法键盘, 它们都是系统 ...

  2. ApacheCN 数据库译文集 20211112 更新

    创建你的 Mysql 数据库 零.前言 一.介绍 MySQL 设计 二.数据采集 三.数据命名 四.数据分组 五.数据结构调整 六.补充案例研究 Redis 学习手册 零.序言 一.NoSQL 简介 ...

  3. react react-smooth动画

    首先自然而然的安装一下依赖: npm install react-smooth --save-dev 接下来就是组件代码啦: import React, { Component, Fragment } ...

  4. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...

  5. JS Map与Set

    笔记整理自:廖雪峰老师的JS教程 Map JavaScript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问题,最新的ES6规范引入了 ...

  6. Android动态加载布局之LayoutInflater【转】

    万分感谢大佬:https://www.jianshu.com/p/6a235ba5ee17 深入了解View<一>之Android LayoutInfalter原理分析 下文为:Layou ...

  7. Copy as Markdown - 将页面链接按照 Markdown 格式copy

    将页面文字和链接组成 Markdown 格式的网址 直接对页面链接右键使用时,无法获取链接标题,只能显示 No Title 所以需要: 选中「想作为标题的部分文字」, 然后去对「页面链接」右键-> ...

  8. iOS开发之工欲善其事,必先利其器

    SimPholders SimPholders是一个快速简单的小工具,可以帮助开发者快速访问iPhone模拟器应用.它可以访问模拟器的文件夹,重置库和文件,以及删除选定的应用程序. 常规做法 找到Fi ...

  9. 关于CSP-S2019的一篇游记

    怎么讲呢? Day1:7:00左右从家里出发,准备还是做得比较充分,早饭也记得吃了.路上闭目养神了一会儿,7:50左右到了大门附近,和大家再次把一些自认为还是比较重要的数据结构之类的再复习了一下.进去 ...

  10. log4j和lockback的比较,二者可否同时使用

    一.log4j和logback的介绍 log4j: 可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:可以控制每一条日志的 ...