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