一、线程
1.概述:
线程是进程的一个执行分支,是在进程内部(线程本质是在进程的地址空间内运行)运行的一个执行流。
2.创建线程
#include <pthread.h>
int pthread_create(
pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void *),
void *restrict arg
运行程序:
运行结果:
终止线程 :void pthread_exit(void *retval);
3.线程连接
int pthread_join(
pthread_t tid,
void **status
);
函数段:
运行程序:
4.线程管理
线程初始化:
int pthread_attr_init(pthread_attr_t *attr);
线程销毁:
int pthread_attr_destroy(pthread_attr_t *attr);
运行:
5.互斥量、互斥锁
1.介绍:
临界区:必须以互斥方式执行的代码段,即在临界区的范围内只能有一个活动的执行线程。
互斥量(Mutex),又称为互斥锁,是用来保护临界区的特殊变量,每个互斥锁内部有一个线程等待队列,保存等待该互斥锁的线程。
有锁定(locked)和解锁(unlocked)状态:
锁定状态,某个特定的线程正持有这个互斥锁,其他线程将阻塞在互斥锁的等待队列内;
解锁状态,没有线程持有这个互斥锁,如果某个线程试图获取这个互斥锁,那么这个线程就可以得到这个互斥锁而不会阻塞。
————————————————
版权声明:本文为CSDN博主「植鱼者子云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_68374375/article/details/124112881
2.初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);
mutex表示的是互斥锁的标号; mutexattr表示的互斥锁的属性。
上锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);’
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);'
效果:
3.死锁
死锁就是让两个进程不断争夺运行资源来使程序进入死锁状态
结果:
变量条件:
互斥锁用来给资源上锁,而条件变量是用来等待而不是用来上锁。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
结果:
6.进程
进程的状态:
R:进程处于运行态或就绪状态,只有在该状态的进程才可能在CPU上运行;
D:不可中断的深睡眠状态,处于这种反状态的进程不能响应异步信号;
S:可中断的浅睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂起;
T:暂停状态或跟踪状态;
W:退出状态,进程即将被销毁;
Z:退出状态,进程成为僵尸进程。
1、进程环境
程序:程序是静态的,程序 = 指令序列(完成特地任务) + 数据
进程:是一个已经开始执行但还没有终止的程序实例。
包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的执行控制流等资源。
一个程序可以实例化为多个进程实体。进程是一个动态的实体
程序到进程转换:查找命令所对应程序文件的位置;
使用fork()函数为之创建一个新进程;
在新进程中调用exec族函数装载程序文件,并执行程序文件的main()函数。
2.获取环境变量
获取环境变量的方式:
3.创建进程
运行结果:
4.创建守护进程:
后台运行的一种特殊进程,独立于控制终端,周期性地执行某种任务或等待处理某些事件
守护进程属于孤儿进程,父进程变为init进程
Linux系统的大多数服务器就是通过守护进程实现
常用daemon()创建守护进程
原型:int daemon(int nochdir,int noclose);
信号函数:
sigaction函数
改变信号的处理方法,SIGKILL和SIGSTO例外。
Kill()函数
向指定的进程发送一个指定的信号,成功返回0,否则返回-1
结果:
4、线程与进程的关系
一个线程只能是某一个进程的一部分,一个进程可以有多个线程(至少有一个主线程)
6.开发板
1.打开LDC图像和屏幕
$ fb-test
$ cd myfb-test
$ ./myfb-test /dev/fb0
2.串口EEPROM
$ cd
$ i2cdetect -l #列出所有ic2总线
$ i2cdetect -y 0 #列出总线0上的设备
矩阵的最左列是十位,最上面是个位。
3.命令控制LED
安装LED驱动
$ cd
$ cd led_driver_qemu/
$ insmod 100ask_led.ko
控制LED零号灯亮,控制LED一号灯灭
$ ./ledtest /dev/100ask_led0 on
$ ./ledtest /dev/100ask_led1 off
4.控制LED
安装驱动
$ cd
$ cd button_driver_qemu/
$ insmod button_drv.ko #扫描你的按键
$ insmod board_100ask_qemu_imx6ull.ko
启动按键控制
$ ./button_led_test