标准C库之raise,abort函数(进程通信函数,发送信号类函数)

前言

如果,想要深入的学习标准C库中的raise,abort函数,还是需要去自己阅读Linux系统中的帮助文档。

具体输入命令:

man 3 raise/abort

即可查阅到完整的资料信息。

raise函数

raise 是一个C语言标准库函数,它的作用是给当前进程发送信号。它属于信号处理库(signal.h),允许程序员通过代码控制信号的发送和处理。

raise 函数原型如下:

#include <signal.h> //使用这个函数需导入此头文件
int raise(int sig);

参数:

  • int sig:要发送的信号。Linux 支持多种信号,sig 参数可以是整数信号代码,也可以是预定义的信号常量。以下是一些常用的信号及其说明:

    • SIGHUP(1):挂起信号,通常用于通知进程重新读取其配置文件。
    • SIGINT(2):中断信号,通常用于用户通过键盘(如按下 Ctrl+C)发送的中断。
    • SIGQUIT(3):退出信号,通常用于用户通过键盘(如按下 Ctrl+\)发送的退出。
    • SIGILL(4):非法指令信号,通常在进程尝试执行非法或未定义的指令时发送。
    • SIGABRT(6):异常中止信号,通常在进程遇到严重错误时发送。
    • SIGFPE(8):浮点异常信号,通常在进程遇到浮点错误时发送。
    • SIGKILL(9):杀死信号,强制结束进程,进程无法捕获或忽略此信号。
    • SIGSEGV(11):段错误信号,通常在进程试图访问非法内存区域时发送。
    • SIGPIPE(13):管道破裂信号,通常在进程向已关闭的管道写入数据时发送。
    • SIGALRM(14):报警信号,通常用于进程超时或定时器到期。
    • SIGTERM(15):终止信号,通知进程优雅地结束,进程可以捕获并执行清理操作。

返回值:

  • 如果函数成功发送信号,返回0。
  • 如果出现错误,返回非0值。

raise 函数可以用于在程序中触发某些事件,如终止进程、中断进程等。例如,当程序在运行过程中遇到不可恢复的错误时,可以使用 raise 函数生成 SIGABRT 信号来终止进程。

一个简单的 raise 示例:

#include <signal.h>
#include <stdio.h> //需导入此头文件
// char *fgets(char *str, int n, FILE *stream);
int main(){

    printf("请输入一个正整数,单数直接杀死进程,双数正常退出\n");
    int num;

    scanf("%d",&num); // 从标准输入读取数据

    if(num % 2 == 1){
        raise(SIGKILL);
    }
    printf("正常退出\n");

    return 0;
}

abort函数

abort是一个标准C库函数,定义在stdlib.h头文件中。该函数主要用于异常情况下中止程序的执行。当程序遇到无法处理的错误或异常情况时,可以调用abort函数立即终止程序,并向操作系统返回一个非零状态码。在终止之前,abort会触发一个SIGABRT信号,这个信号可以被程序捕获以执行特定的操作,例如释放资源或记录错误日志。

函数原型如下:

void abort(void);

请注意,abort函数没有参数,也没有返回值
这是因为调用abort函数的目的是立即终止程序执行,而不是返回错误信息给调用者。

以下是abort函数的一个简单示例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int userInput;

    printf("Enter a positive number: ");
    scanf("%d", &userInput);

    if (userInput < 0) {
        printf("Error: negative number entered!\n");
        abort();
    }

    printf("The entered number is: %d\n", userInput);

    return 0;
}

在这个示例中,我们要求用户输入一个正数。如果用户输入了一个负数,程序会打印错误信息并调用abort函数立即终止程序。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面给出基于STM32 HAL的UART中断形式的发送函数示例。 注意事项: - 使用前请确保已经初始化了UART。 - 建议在使用前先判断一次是否可发送,避免发送堵塞。 - 本例采用了DMA方式发送,需要提前配置好DMA。 示例代码如下: ```c void UART_DMA_Send_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { uint32_t *tmp; uint16_t tmp1 = 0; uint32_t tmpisr = DISABLE; tmp = (uint32_t*)pData; /* Disable the UART DMA Tx request */ huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT); /* Configure the DMA Tx interrupt */ /* Configure the DMA Tx interrupt */ tmpisr = __HAL_UART_DMA_GET_IT_SOURCE(huart, UART_DMA_TX_IT); if(tmpisr == SET) { __HAL_DMA_DISABLE_IT(huart->hdmatx, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); /* Set the DMA Tx transfer complete callback */ huart->hdmatx->XferCpltCallback = NULL; /* Set the DMA Tx transfer half complete callback */ huart->hdmatx->XferHalfCpltCallback = NULL; /* Set the DMA error callback */ huart->hdmatx->XferErrorCallback = NULL; /* Set the DMA abort callback */ huart->hdmatx->XferAbortCallback = NULL; /* Clear the DMA transfer complete flag */ __HAL_DMA_CLEAR_FLAG(huart->hdmatx, __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmatx)); /* Clear the DMA transfer half complete flag */ __HAL_DMA_CLEAR_FLAG(huart->hdmatx, __HAL_DMA_GET_HT_FLAG_INDEX(huart->hdmatx)); /* Clear the DMA transfer error flag */ __HAL_DMA_CLEAR_FLAG(huart->hdmatx, __HAL_DMA_GET_TE_FLAG_INDEX(huart->hdmatx)); } /* Enable the UART DMA Tx request */ huart->Instance->CR3 |= USART_CR3_DMAT; /* Enable the DMA Tx Channel */ HAL_DMA_Start_IT(huart->hdmatx, (uint32_t)tmp, (uint32_t)&huart->Instance->TDR, Size); /* Enable the DMA channel IRQ Channel */ HAL_NVIC_EnableIRQ(huart->hdmatx->IRQn); tmp1 = huart->TxXferSize; /* Check if a non-blocking transfer is ongoing or not */ if (huart->gState == HAL_UART_STATE_BUSY_TX) { return; } /* If it is a put buffer */ if (huart->Init.WordLength == UART_WORDLENGTH_9B) { while (Size--) { huart->pTxBuffPtr[tmp1++] = (*tmp & (uint32_t)0x01FF); tmp++; } } else { while (Size--) { huart->pTxBuffPtr[tmp1++] = (*tmp & (uint8_t)0xFF); tmp++; } } huart->TxXferSize = tmp1; huart->TxXferCount = tmp1; /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Transmit data register empty interrupt */ __HAL_UART_ENABLE_IT(huart, UART_IT_TXE); } ``` 以上是基于HAL的UART中断形式的发送函数示例,由于不同版本的HAL实现细节有所不同,因此具体实现可能会有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宋同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值