Linux消息队列及函数
消息队列的概念消息队列就是一个消息的链表,每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该队列的大量信息,包括消息队列的键值、用户ID、组ID、消息数目、读写进程ID等。其定义如下:
123456789101112131415struct msg_queue{ struct ipc_perm q_perm; time_t q_stime; // last msgsnd time time_t q_rtime; // last msgrcv time time_t q_ctime; // last change time unsigned long q_cbytes; // current number of bytes on queue unsigned long q_qnum; // number of message in queue unsigned long q_qbytes; // max nu ...
Linux命名管道及函数
管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的通信。
命名管道的创建命令方式在shell中可以使用mkfifo命令创建一个命名管道,格式为:
1mkfifo [option] name
其中option选项用于选择创建FIFO的模式,使用形式为-m mode,mode为八进制模式,创建示例:
1mkfifo -m 666 myfifo
创建之后可以在当前文件间看到新建的文件。
函数方式FIFO管道可通过mkfifo()函数创建,函数原型为:
123#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
创建成功返回0,出错返回1。函数第一个参数为普通的路径名,即创建后FIFO文件的名字,第二个参数与打开普通文件的open函数中的mode参数相同。
如果要创建的FIFO文件已经存在,则会返回EEXIST错误,因此在创建前 ...
Linux匿名管道及实例
匿名管道,也称管道,是Linux下最常见的进程间通信方式之一。匿名管道在系统中没有实名,它只是进程的一种资源,会随着进程的结束而被系统清除。
管道的创建与关闭Linux中使用pipe()函数创建一个匿名管道,其函数原型为:
12#include <unistd.h>int pipe(int fd[2]);
创建成功返回0,出错返回1。参数fd[2]是一个长度为2的文件描述符数组,fd[1]是写入端的文件描述符,fd[0]是读出端的文件描述符。
可以使用文件I/O函数read()和write()读管道进行读写,使用close()函数关闭管道两端。
示例,create_pipe.c:
12345678910111213141516171819202122#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main(void){ int fd[2]; char str[256]; if((pipe(fd))<0) { ...
Linux信号种类与函数
主要介绍:
Linux中的信号种类
信号操作的相关函数
Linux中的信号种类信号是一种进程间通信的方法,应用于异步事件的处理。信号的实质是一种软中断。
使用kill -l可以查看Linux系统中的所有信号,如下:
1234567891011121314deeplearning@deeplearning:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 2 ...
IP地址与子网划分
IP地址是一个32位的二进制地址,被分为4个8位段(八位组)。人们不习惯使用32的二进制地址或8位的二进制八位组,所以IP地址最常用的表达形式是点分十进制形式。
IP地址分类IP地址中一部分是网络ID,另一部分是主机ID,地址分类系统把IP地址划分为不同的地址类:‘
A类地址:IP地址的前8位表示网络ID,后24位表示主机ID
B类地址:IP地址的前16位表示网络ID,后16位表示主机ID
C类地址:IP地址的前24位表示网络ID,后8位表示主机ID
使用的位数越多,包含的组合就越多,可知A类地址较少的网络ID,但每个网络都具有大量的可用主机ID。那计算机或路由器是如何将一个IP地址解释为A类、B类还是C类呢?其实二进制的前几位就是用来地址分类,如下表:
地址类
二进制的前几位
点分十进制的第一个字段
排除地址
A
0
0~127
10.0.0.010.255.255.255127.0.0.0127.255.255.255
B
10
128~191
172.16.0.0~173.31.255.255
C
110
192~223
192.168.0.0~192 ...
makefile使用基础
makefile就像一个Bash脚本,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
例子源码sin_value.c
1234567891011#include <stdio.h>#include <math.h>#define pi 3.14159float angle;void sin_value(void){ float value; value = sin ( angle / 180. * pi ); printf ("\nThe Sin is: %5.2f\n",value);}
cos_value.c
1234567891011#include <stdio.h>#include <math.h>#define pi 3.14159float angle;void cos_value(void){ float value; v ...
gcc使用基础
gcc 编译器是 Linux 下默认的 C/C++ 编译器,大部分 Linux 发行版中都是默认安装的。gcc 编译器通常以 Linux 命令的形式在终端(Shell/Bash)中使用。
单一源文件最基础用法hello.c代码如下:
12345#include <stdio.h>int main(void){ printf("Hello World!\n");}
使用gcc编译:
1gcc hello.c
使用ls命令查看当前目录,多出一个a.out可执行文件,运行:
1./a.out
1Hello World!
注意:gcc编译源码,不加任何参数时,生成的可执行性文件默认为a.out,并且没有中间过程的目标文件。
生成目标文件&自定义名称使用**-c参数**可以生成.o结尾的目标文件:
1gcc -c hello.c
使用ls命令查看当前目录,多出一个hello.o目标文件。
继续使用**-o参数**生成可执行文件,并自定义名称:
1gcc -o hello hello.o
其中 “hello” 是指定 ...
Bash基础(二)
主要内容:
逻辑判断:test关键字
选择结构:if-else, case
循环结构:while-do, for
逻辑判断bash不仅可以进行数值运算,通过test关键字还可以进行逻辑判断。
数值大小的判断例如判断3是否大于2的大小:
1test 3 -gt 2; echo $?
10
注意:判断成立,返回0,不成立返回1。
参数
含义
助记
-gt
大于
greater than
-lt
小于
less than
-eq
等于
equal
-ne
不等于
not equal
-ge
大于等于
greater equal
-le
小于等于
less equal
文本字符串的判断例如判断两文本是否相等:
1test abc = abx; echo $?
11
因为判断不成立,所以返回1。
另外注意:等号的两侧要有空格,否则就变成变量赋值了!
参数
含义
=
相等
!=
不相等
>
字典顺序大于
<
字典顺序小于
文件的判断例如判断文件是否存在:
1test -e a.out; echo $?
...
Bash基础(一)
介绍Bash之前首先介绍Shell,shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互。用来区别与核,相当于是一个命令解析器,Shell有很多中,这里列出其中几种 :
Bourne SHell(sh)
Bourne Again SHell(bash)
C SHell(csh)
KornSHell(ksh)
zsh
各个shell的功能都差不太多,在某些语法的下达下面有些区别,Linux预设就是bash。
简单点说,直接把shell和bash先理解为一个东西好了,就是Linux中的那个终端窗口(Terminal),也就是那个小黑框,下面的例子都是在Linux的终端窗口中运行的。
变量变量赋值
基本形式为变量=变量值,注意等号左右不能有空格,变量均为文本形式,如;
1var1=World
对于有空格的变量值,用单引号或双引号包围,如:
1var2='abc bcd'
可以将某个命令输出的文本直接赋予某个变量,命令需要反引号包围,如:
1var3=`date`
变量之间可以赋值,需要使用**$符号**说明是变量,如:
1 ...
CAN通信
简介CAN (Controller Area Network )是 ISO 国际标准化的串行通信协议。1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。
CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
特点
多主控制
在总线空闲时,所有单元都可以发送消息(多主控制),而当两个以上的单元同时开始发送消息时,根据标识符(ID)决定优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接 ...