- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
struct sigaction 用于为处理中断的小型 C 程序设置处理程序。当我在完成第二个处理程序的实现后收到“段错误(核心转储)”错误消息时出现问题。我以完全相同的方式设置了两个处理程序。第一个中断处理程序在没有初始化 sigaction 结构的情况下工作正常,但是,当我完成第二个处理程序的实现时,我收到了 seg 错误错误。
问题:
为什么使用 memset() 初始化 sigaction 结构有助于修复错误?
代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <string.h>
#define ALARMSECONDS 3
int numSigints = 5;
/* Handler function that prints out the current time on a SIGALRM interrupt. */
static void hdl(int signum)
{
time_t currTime;
time(&currTime);
printf("\ncurrent time is %s", ctime(&currTime));
alarm(ALARMSECONDS);//re-arm the alarm
}
/* Handler function that captures SIGINT interrupts 5 times before
actually exiting. Makes use of global variable to keep track of
number of times the interrupt was sent.
*/
static void sigint_hdl(int signum)
{
numSigints -= 1;
if(numSigints == 0)
{
printf("\nFinal Control-c caught. Exiting.\n");
exit(1);
}
else
{
printf("\nControl-c caught. %d more before program is ended.\n",
numSigints);
}
}
/* Periodically prints out the current time in Unix date format using
sigaction interrupt handling.
*/
int main(int argc, char *argv[])
{
//
// vars
//
struct sigaction act;
struct sigaction sigint_act;
memset(&act, '\0', sizeof(act));//TODO Why does this fix SEGFAULT???
//
// intro
//
printf("Date will be printed every 3 seconds.\n");
printf("Enter ^C 5 times to end the program.\n");
//
// set alarm to go off in 3 seconds
//
alarm(ALARMSECONDS);
//
// set handler of the sigaction to 'hdl' function defined above
//
act.sa_handler = hdl;
sigint_act.sa_handler = sigint_hdl;
//
// activate sigaction
//
if(sigaction(SIGALRM, &act, NULL) < 0)
{
perror("sigaction -- SIGALRM");
return 1;
}
if(sigaction(SIGINT, &sigint_act, NULL) < 0)
{
perror("sigaction -- SIGINT");
return 1;
}
//
// infinite loop
//
while(1) {
}
return 0;
}
最佳答案
sigaction
中有许多字段结构体。将它们全部设为零会将它们设置为默认值。
如果它们不是零,它们将按照系统调用文档中描述的任何方式进行解释。一个示例是两个字段 sa_mask
和 sa_sigaction
.并取决于 sa_mask
的值, sa_sigaction
handler 将被调用,而不是您的代码安装的预期信号处理程序。而且由于您没有初始化指针,因此它将具有一些垃圾值,并且将尝试不仅取消引用,而且通过垃圾指针调用函数。
因此,如果您未能初始化结构,您将获得未定义的行为。有时它会起作用,有时它不会以神秘的方式起作用,例如崩溃。
通过将整个结构清零,您可以确保默认行为将发生,正如您对结构所做的任何非默认设置所修改的那样。
经验教训:始终清除并初始化传递给库函数的所有结构。
关于c++ - 为什么使用 memset() 初始化 sigint 变量有助于防止 Seg Faults?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39502036/
这是一个类作业,用于将有序插入到已排序的链表中。我已经避免访问空指针,并且添加了一些调试输出行以将段错误缩小到 while 循环本身的条件语句。 我可以将一个节点添加到空列表并将具有较小键的节点添加到
一个小型测试程序在 64 位 Linux 上使用 gfortran (4.4.5) 返回段错误。 n=2_8**22_8 时不存在故障。 gdb 指示在循环的第一次迭代期间函数 mylen 中发生段错
我正在使用 Spring-WS,当我通过 webServiceTemplate 中的 marshalSendAndReceive 调用 Web 服务时,我收到错误代码为 500 的 SOAP 错误。不
我有一个具有此方法的单例数据管理器: -(NSArray*)fetchItems { NSEntityDescription *entity = [NSEntityDescription
我有一个调用 Web 服务的 Java 应用程序 (A)。 1)然后我有另一个使用 A jar 的应用程序 (B)。调用成功,返回需要的数据。 2)然后我有一个也使用A jar 的网络应用程序。在这种
我正在 Java 应用程序中对第三方网络服务进行 SOAP 网络服务调用。用于查找 Web 服务、传输数据和发出 SOAP 请求的 Java 类是使用来自 WSDL 的 Apache CXF 库生成的
我正在尝试学习 SOAP 协议(protocol)。因此,在使用以下命令借助 wsimport 生成 net.webservicex 代码后 C:\Program Files\Java\jdk1.8.
我正在构建一个基于配备 arm64 CPU 的 UltraScale+ FPGA 的数据采集系统。数据通过 DMA 传输到 RAM。驱动程序中的 DMA 缓冲区保留如下: virt_buf[i] =
我使用 QtDesigner 创建了两个对话框“listdialog.ui”和“editdialog.ui”,已发布使用Qt5.3.1,然后添加到项目“phone book.pro”“带有源代码”使用
有谁知道空中交通管制系统是如何实现软件容错的? 一些 URL 会很有帮助。 最佳答案 Lockheed 不久前发表了一些关于此的文章。看看here . 许多系统都使用 Ada,它明确支持验证命题和其他
我认为阅读内存应该不会引起任何问题,例如 char *d=""; char *d2="test"; memcmp(d,d2,10); memcmp() 永远 会失败吗? 最佳答案 您的假设是不正确的,
这个程序在我的 UNIX 机器上导致了段错误。我将原因缩小到 memset() 的第二次调用。 为什么会出现这种行为?第一个“ block ”代码与第二个几乎相同,不是吗?为什么 第一次 调用 mem
我很困惑进程在使用虚拟内存时如何可能出现段错误。据我了解,“虚拟”内存允许进程访问所有可用内存,然后将其映射到“实际”硬件内存。通过这种转换,进程怎么可能尝试访问不允许访问的内存部分? 最佳答案 听起
Tritwise操作(向右旋转和疯狂操作)无法正确运行,并在Malbolge编译器/解释器中引发分段错误。 在看到有关Coding Challenges和Code Golf的惊人答案之后,我决定开始在
这是我的代码 #include #include #include /************************************************** a is a poin
我有下面的代码。当我取消注释 temperature(i,j) = anode_temperature 时,我会出现 SegFault。 forall(i=0:Cells(1), j=0:Cells(
我是 C 编程新手,我的代码中出现了段错误。该程序使用返回函数来询问用户他们的银行帐户中有多少钱。稍后我将添加代码来计算利息。感谢您为我查看此内容,因为我很难找出为什么会出现此错误。 #include
为了测试,我编写了一个代码来计算 #include int main(void) { int p, i, primes[50], index; boo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
考虑 const a = [1,2,3] console.log(a[5]) // returns undefined 我是一名 C 和 Fortran 程序员,我预计会发生段错误。这里的内存是如何管
我是一名优秀的程序员,十分优秀!