Linux学习记录备份

uname -r查看树莓派版本
rm * -rf全部删除
ctrl shift + 放大终端
xrandr -s +分辨率
pwd显示当前文件夹
file 文件 查看文件的属性

unsigned int millis (void)
这个函数返回 一个 从你的程序执行 wiringPiSetup 初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 毫秒数。返回类型是unsigned int,最大可记录 大约49天的毫秒时长。
unsigned int micros (void)
这个函数返回 一个 从你的程序执行 wiringPiSetup 初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 微秒数。返回类型是unsigned int,最大可记录 大约71分钟的时长。
void delay (unsigned int howLong)
将当前执行流暂停 指定的毫秒数。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达49天
void delayMicroseconds (unsigned int howLong)
将执行流暂停 指定的微秒数(1000微秒 = 1毫秒 = 0.001秒)。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达71分钟

gpio readall 调出树莓派

树莓派和电脑之间的串口通讯:
打开并初始串口
int serialOpen (char *device, int baud)

device:串口的地址,在Linux中就是设备所在的目录。

默认一般是"/dev/ttyAMA0",我的是这样的。

baud:波特率

返回:正常返回文件描述符,否则返回-1失败。

关闭fd关联的串口
void serialClose (int fd)
fd:文件描述符

发送一个字节的数据到串口
void serialPutchar (int fd, unsigned char c)
fd:文件描述符,c:要发送的数据

发送一个字符串到串口
void serialPuts (int fd, char *s)
fd:文件描述符,s:发送的字符串,字符串要以’\0’结尾

cd(切换目录)
pwd(显示当前工作目录的绝对路径)
clear(清除屏幕上的信息)
mkdir(创建目录)
rmdir(删除目录)
rm(删除不需要的文件)
cp(复制)
mv(重命名)
cat(查看文件内容
sudo rm /usr/lib/libcalc.so(删掉某个路径下的某个文件)

linux库引入之分文件编程
好处:分模块编程思想
1.功能责任划分清晰
2.方便调试
3.主程序简洁

实现步骤:
mkdir test 创建一个test文件
cd test/ 移动到test文件下
cp …/calculator.c . 将要用的代码拷贝到test文件下
cp calculator.c calcufuncs.c再拷贝一份代码
calculator.c 主程序,只留下main函数
calcufuncs.c 功能性程序,只留下功能性函数
cp calcufuncs.c calcufuncs.h 再拷贝一份文件
calcufuncs.h 相当于桥梁只留下功能性程序的函数名
将主程序calculator.c中添加#include"calcufuncs.h"
gcc calculator.c calcufuncs.c将主程序和功能性程序一起编译
最后运行

linux库引入之动态库静态库
静态函数库,共享函数库,动态加载函数库
a)静态库
静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
优点: 运行快
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:大
b)动态库
动态函数库,是在程序执行时动态(临时)由目标程序去调用
缺点: 运行慢
优点: 小

库的制作步骤
使用gcc calcufuncs.c -c生成calcufuncs.o文件
使用指令ar rcs libcalcufunc.a calcufuncs.o生成 libcalcufunc.a
编译的时候掐头去尾gcc calculator.c -lcalcufunc掐头去尾
也可以用指令gcc calculator.c -lcalcufunc -L./
-lcalcufunc -l是制定要用的动态库,库名砍头去尾

./代表当前路径
-L告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找
可以将编译的进行命名gcc calculator.c -lcalcufunc -L./ -o mainProStatic

静态库的制作:格式xxxx.a
a.gcc calcufuncs.c -c 生成xxx.o文件
b.ar rcs libcalcufunc.a calcufuncs.o xxx.o文件生成xxx.a静态库文件

动态库的制作:
calcufuncs.c功能性函数文件
libcalc.so 生成的动态库
用指令gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared 指定生成动态库
-fpic 标准
fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
编译动态库:
gcc calculatorT.c -lcalc -L ./ -o mainProDy

如何成功运行
1.sudo cp libcalc.so /usr/lib/将文件拷贝
2.带动态库的程序,可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
只有配置了的窗口可以用,临时:export LD_LIBRARY_PATH="/home/pi/back/test当前路径"
所有窗口都可以用,永久:写脚本
vi star.sh
进入脚本
export LD_LIBRARY_PATH="/home/CLC/test当前路径"
./mainProDy
退出脚本
给脚本加可执行权限:
chmod +x start.sh
运行脚本 ./start.sh

静态库:
gcc calculatorT.c -lcalcufunc -L ./ -o mainProStatic
-lcalcufunc -l是制定要用的动态库,库名砍头去尾
-L告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib /usr/local/lib去找

静态库比动态库大

头文件“”和<>之间的区别
<>会默认在ls /usr/local/inlcude/或ls /usr/inlcude/下面找
“”优先从当先路径下面寻找

192.168.43.88
默认账号:pi
默认密码:raspberry
gg快速回到第一行
=G一键缩进
2 yy p
int main(int argc,char **argv)
fork()
等于0进入子进程

linux线程
#include <pthread.h>
线程创建
int pthread_create(pthread_t *thread//长整形指针, const pthread_attr_t *attr//线程属性(NULL),void *(*start_routine) (void *)//线程函数指针, void *arg//指针传参参数);
成功返回0,失败返回-1

线程退出
void pthread_exit(void *retval);

线程等待
int pthread_join(pthread_t thread, void **retval//收回线程退出状态(NULL));

pthread_t pthread_self(void);

pthread_mutex_t mutex;
互斥锁
解锁:pthread_mutex_unlock(指针);
加锁:pthread_mutex_lock(指针);

初始化锁:pthread_mutex_init(指针,线程属性(NULL))
结束后摧毁锁:pthread_mutex_destroy(指针);

用linux写脚本
vi text.sh
./a.out
./a.out
./a.out
chmod +x test.sh
./test.sh

int mian()
{
int i = 0;
for(i=0; i<100;i++){
system("./pthread"//需要测试文件名);
}
}

结束测试:新开终端
ps- aux |grep a.out
kill -9解决

死锁
两个锁相互竞争导致线程无法进行下去
解决办法:

线程条件控制实现线程的同步
静态初始化:pthread_cond_t = PTHREAD_COND_INITIALIZER;
pthread_mutext_t = PTHREAD_MUTEXT_INITIALIZER;
动态初始化:在main函数中初始化
pthread_cond_t cond;
初始化:pthread_cond_init(指针 条件,属性(NULL))
条件:pthread_cond_init
销毁:pthread_cond_destroy(指针 条件)
触发:pthread_cond_signal(指针 条件)//单独线程
广播:pthread_cond_broadcast//多个线程
等待:pthread_cond_wait(指针 条件,指针 锁);

测试:
int main(int argc,char **argv)
{
int i = 0;
int time = atoi(argv[1]);

    for(i=0;i<time;i++){
            system("./demo5");
    }

}

./a.out 10 >>test.ret.txt &

ftp云盘//买楼房送女朋友
//server:

1.创建套接字//买一栋楼

int socket(int domain//协议族,int type//参数指定socket的类型,int protocol//写0自动分配协议);
AF_INET //因特网域
SOCK_STREAM //TCP
SOCK_DGRAM //UDP

2.为套接字添加ip地址和端口号//告诉女朋友楼号和房间号
bind(); int bind(int sockfd//socket描述符, const struct sockaddr *addr//结构体指针指向sockaddr类型的指针,socklen_t addrlen//结构体的长度);
可以在cd /usr/include/下面寻找此结构体
然后调用grep “struct sockaddr_in {” * -nir查找

struct sockaddr_in{
sa_family_t sin_family;//协议族
in _ port_t sin_port//端口号5000以上5000-9000,调用htons转换端口号,需要用htons转化,再用atoi转换
struct in_addr sin_addr;//IP地址结构体(127.0.0.1)
unsigned char sin_zero[8];//屁用没有的填充

}//需要进行强制转换
//ifconfig

3.地址转API//给女朋友钥匙
int inet_aton(const char* straddr//IP地址,struct in_addraddrp);
char
inet_ntoa(struct in_addr inaddr);

4.listen()//收拾收拾等女朋友来
int listen(int sockfd, int backlog//数量);

5.accept()//女朋友来了
int accept(int sockfd, struct sockaddr *addr//客户端的地址,socklen_t *addrlen客户端的地址长度);

6.文件的收发//女朋友要不要在这里住(先写后读)
read
ssize_t read(int fd, void *buf, size_t count);
128

write
ssize_t write(int fd, const void *buf, size_t count);
sizeof

//clinet:
1.创建套接字//买一栋楼
2.客户端connect()连接主机
int connect(int sockfd, const struct sockaddr *addr//服务端的地址, socklen_t addrlen长度);

if(argc != 3){
printf(“param is not good”);
exit(-1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值