sigaction函數詳解

一、sin函數

在講述sigaction函數之前,我們需要先來了解一下sin函數。sin函數是數學中的三角函數之一,表示正弦函數。它是周期函數,可以用一個簡單的圖形表示,如下所示:

# include <stdio.h># include <math.h>int main(){    double x = 0.0;    double result = 0.0;    printf("x\tsin(x)\n");    printf("------------------------\n");    while(x <= 360.0)    {        result = sin(x * M_PI / 180);        printf("%.1f\t%.4f\n", x, result);        x += 10.0;    }    return 0;}

以上代碼可以輸出從0度到360度之間的sin值,結果如下:

x    sin(x)------------------------0.0    0.000010.0    0.173620.0    0.342030.0    0.500040.0    0.642850.0    0.766060.0    0.866070.0    0.939780.0    0.984890.0    1.0000100.0    0.9848110.0    0.9397120.0    0.8660130.0    0.7660140.0    0.6428150.0    0.5000160.0    0.3420170.0    0.1736180.0    0.0000190.0    -0.1736200.0    -0.3420210.0    -0.5000220.0    -0.6428230.0    -0.7660240.0    -0.8660250.0    -0.9397260.0    -0.9848270.0    -1.0000280.0    -0.9848290.0    -0.9397300.0    -0.8660310.0    -0.7660320.0    -0.6428330.0    -0.5000340.0    -0.3420350.0    -0.1736360.0    -0.0000

二、sin函數是奇函數

除此之外,還有一個特性-奇函數。所謂奇函數,就是在函數圖象上具有對稱軸,其表現形式為:f(-x)=-f(x)。由於sin函數圖象具有一個對稱軸,即y軸(值域),所以sin函數是一個奇函數。

代碼示例如下:

# include <stdio.h># include <math.h>int main(){    double x = -180.0;    double result = 0.0;    printf("x\tsin(x)\tsin(-x)\n");    printf("------------------------\n");    while(x <= 180.0)    {        result = sin(x * M_PI / 180);        printf("%.1f\t%.4f\t%.4f\n", x, result, -result);        x += 10.0;    }    return 0;}

以上代碼輸出從-180度到180度之間的sin值及其相反數,結果如下:

x    sin(x)    sin(-x)-------------------------180.0    0.0000    -0.0000-170.0    -0.1736    0.1736-160.0    -0.3420    0.3420-150.0    -0.5000    0.5000-140.0    -0.6428    0.6428-130.0    -0.7660    0.7660-120.0    -0.8660    0.8660-110.0    -0.9397    0.9397-100.0    -0.9848    0.9848-90.0    -1.0000    1.0000-80.0    -0.9848    0.9848-70.0    -0.9397    0.9397-60.0    -0.8660    0.8660-50.0    -0.7660    0.7660-40.0    -0.6428    0.6428-30.0    -0.5000    0.5000-20.0    -0.3420    0.3420-10.0    -0.1736    0.17360.0        0.0000    -0.000010.0        0.1736    -0.173620.0        0.3420    -0.342030.0        0.5000    -0.500040.0        0.6428    -0.642850.0        0.7660    -0.766060.0        0.8660    -0.866070.0        0.9397    -0.939780.0        0.9848    -0.984890.0        1.0000    -1.0000100.0    0.9848    -0.9848110.0    0.9397    -0.9397120.0    0.8660    -0.8660130.0    0.7660    -0.7660140.0    0.6428    -0.6428150.0    0.5000    -0.5000160.0    0.3420    -0.3420170.0    0.1736    -0.1736180.0    0.0000    -0.0000

三、sin函數圖

sin函數的圖象是在以坐標軸為邊界的矩形區域內,從y=0開始向上扭曲的曲線。由於sin函數是一個周期函數,所以曲線會在以原點為中心的對稱軸處交叉。

以下是一個標準的sin函數的圖象:

# include <stdio.h># include <math.h>int main(){    printf("Sin(x):\n");    for (double y = 1.0; y >= -1.0; y -= 0.1)    {        for (double x = 0.0; x <= 6.28; x += 0.1)        {            if (y  sin(x))            {                printf(".");            }            else            {                printf("|");            }        }        printf("\n");    }    return 0;}

以上代碼可以輸出一個標準的sin函數圖像,結果如下:

Sin(x):                      |                 |     |                 |     |            |     |     |            |     |     |                      .   .                 |   |                 |   |                |    .             |          .         |             |        |              |       |              |     |                |    |                   |  |                   ||           

四、signal函數和sig函數

接下來我們來看一下signal函數和sig函數,它們與sigaction函數密切相關。

signal函數的作用是為接收到的信號設置自定義的處理函數,其原型如下:

 void (*signal(int signum, void (*handler)(int)))(int);

signal函數的第一個參數是信號編號,第二個參數是信號處理函數的地址,函數指針類型為void (*)(int),即接受一個int類型參數,返回void。

sig函數的作用與signal函數相同,用於設置信號處理函數,並且可以保存原處理函數的地址,其原型如下:

void (*sig(int signum, void (*handler)(int)))(int);

signal函數和sig函數都是用來設置信號處理函數的,接下來我們以signal函數為例,來看一下具體的用法。

以下代碼設置了SIGINT信號(即ctrl+c),並常規捕獲該信號。

# include <stdio.h># include <stdlib.h># include <signal.h>void sig_int(int signo){    printf("received SIGINT\n");}int main(){    if (signal(SIGINT, sig_int) == SIG_ERR)    {        fprintf(stderr, "signal error\n");        exit(1);    }    for(;;)    {        pause();    }}

當我們運行以上代碼時,程序會進入死循環,等待SIGINT信號的到來。如果收到該信號,便會列印出信息”received SIGINT”,並正常退出程序。

五、sigaction函數

sigaction函數是一種較為高級的信號處理函數,與signal函數的差異在於其更加精確且可靠,可以更好地控制信號的處理方式。

sigaction函數的原型如下:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

sigaction函數有三個參數:

  • signum表示信號編號
  • act表示新的信號處理方法
  • oldact返回原有的信號處理方法

以下代碼實現了SIGINT信號的自定義處理,如下所示:

# include <stdio.h># include <stdlib.h># include <signal.h>void sig_int(int signo){    printf("received SIGINT\n");}int main(){    struct sigaction newact, oldact;    newact.sa_handler = sig_int;    sigemptyset(&newact.sa_mask);    newact.sa_flags = SA_RESETHAND;    if (sigaction(SIGINT, &newact, &oldact) < 0)    {        fprintf(stderr, "sigaction error\n");        exit(1);    }    for (;;)    {        pause();    }}

以上代碼中,首先定義了newact和oldact兩個結構體變數,分別代表了新的信號處理方法和舊的信號處理方法。然後,通過初始化newact變數的成員,將其設為SIGINT信號的自定義處理方式,並用sigaction函數進行設置。最後,進入死循環,等待接收信號。

六、sin函數導數

sigaction函數和sin函數在形式上不斷地出現,我們接下來以sin函數的導數來講述sigaction函數的操作

一個函數在某一點的導數,即在該點處的切線斜率。假設f(x)是在點x0處可微,則其導數表達式可以寫作

f'(x) = lim(h->0) f(x0+h) - f(x0) / h

由於計算機無法處理”無限小”的概念,我們需要使用數值計算的方法來進行求解。以下代碼可以計算sin(x)函數在x=0.0處的導數,結果如下所示:


# include <stdio.h>
# include <math.h>

double f(double x)
{
return sin(x);
}

double df(double x)
{
double eps = 1e-8;
return (f(x + eps) - f(x)) / eps;
}

int main()
{
printf("sin

原創文章,作者:CAGL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138260.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CAGL的頭像CAGL
上一篇 2024-10-04 00:19
下一篇 2024-10-04 00:19

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論