一、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-hant/n/138260.html