标签: signal-handling

iPhone - 如何正确处理异常情况(信号?)

在我的iphone应用程序中,我想提供某种应用程序终止处理程序,它将在应用程序终止之前完成一些最终工作(删除一些敏感数据).

我想尽可能多地处理终止情况:
1)用户终止应用程序
2)设备电池耗尽
3)系统由于某种原因终止应用程序(例如内存不足或应用程序冻结)
4)应用程序崩溃(EXC_BAD_ACCESS或SIGSEGV)

还有其他特殊情况吗?
实现此目的的最佳方法是什么(例如,情境2中调用的applicationWillTerminate方法)?
是否可以在信号处理程序中进行清理(包括iPhone安全框架调用)?

问候

iphone exc-bad-access signal-handling

5
推荐指数
1
解决办法
417
查看次数

我可以写保护Linux进程的地址空间中的每个页面吗?

我想知道是否有办法在Linux进程的地址空间中写入保护每个页面(从进程本身的内部,通过 mprotect()).通过"每一页",我的意思是进程的地址空间的每个页面都可以由用户模式下运行的普通程序写入 - 所以,程序文本,常量,全局变量和堆 - 但是我会对常量,全局变量和堆很满意.我不想写保护堆栈 - 这似乎是一个坏主意.

一个问题是我不知道从哪里开始写保护内存.看一下/proc/pid/maps,它显示了给定pid使用的内存部分,它们似乎始终以地址0x08048000和程序文本开头 .(在Linux中,据我所知,进程的内存是使用底部的程序文本,然后是常量,然后是全局,然后是堆,然后是一个不同大小的空白空间,具体取决于大小堆栈或堆栈,然后堆栈从虚拟地址的内存顶部向下生长0xffffffff.)有一种方法可以告诉堆顶部的位置(通过调用sbrk(0),它只返回指向当前"break"的指针,即,堆的顶部),但不是真正告诉堆开始的方式.

如果我尝试保护所有页面0x08048000直到休息,我最终会收到mprotect: Cannot allocate memory错误.我不知道为什么mprotect要分配内存 - 而Google并不是很有帮助.有任何想法吗?

顺便说一句,我想这样做的原因是因为我想创建一个在程序运行期间写入的所有页面的列表,我能想到这样做的方法是写保护所有页面,让任何尝试的写入导致写入错误,然后实现写入错误处理程序,将页面添加到列表,然后删除写保护.我想我知道如何实现处理程序,只要我能找出要保护的页面以及如何操作.

谢谢!

linux mprotect signal-handling segmentation-fault

5
推荐指数
1
解决办法
1290
查看次数

C++中的信号处理

类型的void (*)(int)参数与类型的参数不兼容__sighnd64_t

下面是我的简单代码:

#include <iostream>
#include <string>
#include <signal.h>
#include <ctype>
#include <stdlib.h>
#include <stdio.h>
typedef struct mystrcut
{

  int a;
  char *b;

} mystr;

void set_string ( char **, const char * );
void my_handler(int s)
{
    printf("Caught signal %d\n",s);
    exit(1);

}

int main()
{
    const std::string str1[] = {"hello1", "hello2"};
    char str2[50];
    size_t size1 = str1[1].size();
    cout << size1;
    memcpy (str2, str1[1].c_str(), size1);

    cout << str2;
    mystr *m = NULL;
    m = new mystrcut;
    m->a …
Run Code Online (Sandbox Code Playgroud)

c++ signal-handling openvms

5
推荐指数
1
解决办法
1239
查看次数

从信号处理程序返回

我没有以正确的方式离开我的信号处理函数吗?它似乎没有正常返回程序.相反,它进入循环,它应该等待用户输入,它跳过并读取"用户输入"的长度为-1并出错.(在代码中更有意义.)

void handle_SIGINT() {

    int k = recent;
    int count = 0;
    int stop;

    if (stringSize >= 10) {
        stop = 10;
    }
    else {
        stop = p;
    }

    printf("\nCommand History:\n");

    for (count = 0; count < stop; count++) {

        if (k < 0) {
            k += 10;
        }
        printf("%s", string[abs(k)]);
        k -= 1;

    }

}



void setup(char inputBuffer[], char *args[],int *background)
{
    //char inputBuffer[MAX_LINE];
    int length, /* # of characters in the command line */
    i,      /* loop index …
Run Code Online (Sandbox Code Playgroud)

c signal-handling

5
推荐指数
1
解决办法
4257
查看次数

Perl Term :: ReadLine :: Gnu信号处理的难点

我正在使用Term :: ReadLine :: Gnu并遇到了信号处理问题.鉴于下面的脚本和发送到脚本的TERM信号,在按下回车键之前,不会触发TERM信号的处理程序.使用Term :: ReadLine:Perl不会发生这种情况.

我已经读过Term :: ReadLine :: Gnu有自己的内部信号处理程序,但坦率地说,我不知道如何使用它们.

我已经回顾了http://search.cpan.org/~hayashi/Term-ReadLine-Gnu-1.20/Gnu.pm#Term::ReadLine::Gnu_Variables尝试将rl_catch_signals变量设置为0,但这没有帮助.理想情况下,我想与Gnu信号处理程序一起工作,但我也会满足于禁用它们.

为了绝对具体,我需要TERM处理程序在接收到信号后触发,而不是等待按下回车键.

任何帮助或建议当然感谢!

#!/usr/bin/perl

use strict;
use warnings;
use Term::ReadLine;

$SIG{TERM} = sub { print "I got a TERM\n"; exit; };

my $term = Term::ReadLine->new('Term1');
$term->ornaments(0);
my $prompt = 'cmd> ';
while ( defined (my $cmd = $term->readline($prompt)) ) {
    $term->addhistory($cmd) if $cmd !~ /\S||\n/;
    chomp($cmd);
    if ($cmd =~ /^help$/) {
        print "Help Menu\n";
    }
    else {
        print "Nothing\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

perl readline signal-handling

5
推荐指数
1
解决办法
621
查看次数

信号处理程序不会看到全局变量

这是问题:这个程序应该从stdin接收输入并计算插入的字节数; SIGUSR1信号将停止主程序并在文件标准错误上打印当我发送SIGUSR1时已经复制了多少字节.

这就是我老师要我这样做的方式:在一种终端类型中

cat /dev/zero | ./cpinout | cat >/dev/null
Run Code Online (Sandbox Code Playgroud)

而从第二个终端发送信号

kill -USR1 xxxx
Run Code Online (Sandbox Code Playgroud)

其中xxxx是cpinout的pid.

我更新了以前的代码:

/* cpinout.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

#define BUF_SIZE 1024   

volatile sig_atomic_t countbyte = 0;
volatile sig_atomic_t sigcount = 0;

/* my_handler: gestore di signal */
static void sighandler(int signum) {
    if(sigcount != 0)
        fprintf(stderr, "Interrupted after %d byte.\n", sigcount);
    sigcount = contabyte;
}

int main(void) {

    int c;
    char buffer[BUF_SIZE];
    struct sigaction action;

    sigemptyset(&action.sa_mask);
    action.sa_flags = 0; …
Run Code Online (Sandbox Code Playgroud)

c scope signals signal-handling

5
推荐指数
1
解决办法
3327
查看次数

所有信号的信号处理程序

如何使用signal(3)为正在运行的操作系统上可用的ALL信号注册信号处理程序?

我的代码看起来像这样:

void sig_handler(int signum)
{
    printf("Received signal %d\n", signum);
}


int main()
{
    signal(ALL_SIGNALS_??, sig_handler);
    while (1) {
        sleep(1);
    };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c unix linux signal-handling

5
推荐指数
1
解决办法
869
查看次数

pthreads之间的信号处理

我正在尝试学习进程和线程之间的信号处理.几个问题的答案将帮助我更好地理解它.

我知道进程可以向进程组发送信号并允许多个进程接收相同的信号,但我不确定线程​​.

  • 发送到所有pthread的信号是否可以由多个pthread同时处理?

我设置我的程序阻止所有信号使用pthread_sigmask(),我有两个线程sigwait(SIGUSR1)用来等待信号,我有主线程发送SIGUSR1信号.似乎只有一个线程处理信号时一切正常(我在另一个线程中注释掉代码),但是当两个线程都运行sigwait()代码时它会挂起或终止太快.

代码粘贴在下面.

sig_atomic_t signals = 0;
sig_atomic_t sigusr1_signals = 0;
sig_atomic_t sigusr2_signals = 0;
sig_atomic_t count = 0;
sig_atomic_t totalcount = 0;

sigset_t globalset;

int WAIT = 1;           /* false = 0, true = 1 */

static int SIGNALS_SENT = 0;
static int SIGNALS_RECEIVED = 0;

void *sig1handler1(void *argv);

void *reporterhandler(void *argv);

int random_number(int min, int max);

int main(void) {

    pthread_t threads[2];   /* create an array to store a number of …
Run Code Online (Sandbox Code Playgroud)

c multithreading signals pthreads signal-handling

5
推荐指数
1
解决办法
994
查看次数

C中的两个顺序赋值语句是否可以在硬件上无序执行?

鉴于以下C程序:

static char vals[ 2 ] = {0, 0};

int main() {

char *a = &vals[0];
char *b = &vals[1];

while( 1 ) {

    SOME_STUFF()

    // non-atomic operations in critical section
    if( SOME_CONDITION() )
        {
        *a = 1;
        *b = 2;
        }
    else
        {
        *a = 0;
        *b = 0;
        }


    SOME_OTHER_STUFF()

    }

return 0;
}

int async_interrupt( void ) {

PRINT( a );
PRINT( b );
}
Run Code Online (Sandbox Code Playgroud)

硬件是否有可能首先将值实际加载2到内存位置&vals[1],以便中断例程可以执行并查看vals[1] == 2vals[0] == 0 …

c interrupt memory-model signal-handling

5
推荐指数
2
解决办法
127
查看次数

C 用循环等待信号

在C Linux中,有没有办法像等待信号一样SIGUSR1并且SIGUSR2不循环?

例如,在这段代码中,我等待SIGUSR1SIGUSR2打印消息,但是当我想要时,我会在 true 时执行......

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

void signal_callback_handler(int signum)
{
   printf("Caught signal %d\n",signum); 
}

int main()
{
   signal(SIGUSR1, signal_callback_handler);
   signal(SIGUSR2, signal_callback_handler);
   while(1)
   {
      printf("Program processing stuff here.\n");
      sleep(1);
   }
   return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我如何才能等待并且不做任何事情(在 true 时不做)直到SIGUSR1SIGUSR2到达?

例如 :

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

void signal_callback_handler(int signum)
{
   printf("Caught signal %d\n",signum); 
}

int main()
{
   signal(SIGUSR1, signal_callback_handler);
   signal(SIGUSR2, signal_callback_handler);

    printf("this …
Run Code Online (Sandbox Code Playgroud)

c linux signals signal-handling

5
推荐指数
1
解决办法
2万
查看次数