课堂笔记九之嵌入式C多线程开发

本文详细介绍了嵌入式C语言中的信号处理和多线程开发。首先讲解了信号的概念、产生、列表、发送及处理方式,包括信号API的使用。接着讨论了线程的定义、存在的原因、与进程的区别以及线程的创建、退出、等待、状态和同步机制。内容深入浅出,是理解嵌入式系统中信号和线程操作的重要参考资料。
摘要由CSDN通过智能技术生成
一、信号

1、信号是一种向进程发送通知,告诉其某件事情发生了的一种简单通信机制
2、信号的产生
(1)另一个进程发送信号
(2)内核发送信号底层硬件发送信号
(3)底层硬件发送信号
3、信号列表
(1)常用信号
在这里插入图片描述
在这里插入图片描述
4、信号发送
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
kill命令就是调用这个函数来实现。
#include <signal.h>
int raise(int sig);
功能:
1)kill:向PID所指向的进程发送指定的信号。
2)raise:向当前进程发送指定信号。
返回值:
1)kill:成功返回0,失败返回-1,errno被设置。
2)rasie:成功返回0,失败返回非0。
(1)int kill(pid_t pid,int sig);
(2)int raise(int sig);
(3)unsigned int alarm(unsigned int seconds);
(4)void abort();
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、进程挂起pause
pause:只要一直处于休眠状态,表示pause函数一直是调用成功的。
当被信号唤醒后会返回-1,表示失败了,errno的错误号被设置EINTR(表示函数被信号中断)6、信号处理方式
(1)忽略:收到信号等于没收到;
(2)执行用户需要执行的动作(捕获):收到信号,不做默认处理,做想要的处理;
(3)默认处理:信号自生作用(终止)。
7、信号处理API
(1)sighandler_t signal(int signum, sighandler_t handler);
参数:
1)signum:信号编号。
2)handler:信号处理方式。
sighandler_t是被typedef后的类型,原类型 void (*)(int),这是一个函数指针类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sighandler_t handler也有直接写成void (*handler)(int);
sighandler_t signal(int signum, void (*handler)(int));

a. 忽略:SIG_IGN
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
b.默认:SIG_DFL
c.捕获:填写类型为void (*)(int)的捕获函数的地址,当信号发生时,会自动调用捕获函数来进行相应的处理。
当然这个捕获函数需要我们自己来实现,捕获函数的int参数,用于接收信号编号。捕获函数也被称为信号处理函数。
返回值:
成功:返

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/************************************************ * * The classic producer-consumer example. * Illustrates mutexes and conditions. * by Zou jian guo * 2003-12-22 * *************************************************/ #include #include #include #include "pthread.h" #define BUFFER_SIZE 16 /* Circular buffer of integers. */ struct prodcons { int buffer[BUFFER_SIZE]; /* the actual data */ pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */ int readpos, writepos; /* positions for reading and writing */ pthread_cond_t notempty; /* signaled when buffer is not empty */ pthread_cond_t notfull; /* signaled when buffer is not full */ }; /*--------------------------------------------------------*/ /* Initialize a buffer */ void init(struct prodcons * b) { pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NULL); pthread_cond_init(&b->notfull, NULL); b->readpos = 0; b->writepos = 0; } /*--------------------------------------------------------*/ /* Store an integer in the buffer */ void put(struct prodcons * b, int data) { pthread_mutex_lock(&b->lock); /* Wait until buffer is not full */ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n"); pthread_cond_wait(&b->notfull, &b->lock); } /* Write the data and advance write pointer */ b->buffer[b->writepos] = data; b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /* Signal that the buffer is now not empty */ pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock); } /*--------------------------------------------------------*/ /* Read and remove an integer from the buffer */ int get(struct prodcons * b) { int data; pthread_mutex_lock(&b->lock); /* Wait until buffer is not empty */ while (b->writepos == b->readpos) { printf("wait for not empty\n"); pthread_cond_wait(&b->notempty, &b->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值