Android 系统调用SIGSSUSPEND返回-ERESTARTNOHAND,我应该怎么做?

Android 系统调用SIGSSUSPEND返回-ERESTARTNOHAND,我应该怎么做?,android,signals,system-calls,Android,Signals,System Calls,我在我的应用程序中调用syscallsigssuspend(apisys\u sigssuspend),错误号为-ERESTARTNOHAND。但是我在errno.h中获得了以下信息,似乎我不应该在我的应用程序中获得errno /* 8 * These should never be seen by user programs. To return one of ERESTART* 9 * codes, signal_pending() MUST be set. Not

我在我的应用程序中调用syscallsigssuspend(apisys\u sigssuspend),错误号为-ERESTARTNOHAND。但是我在errno.h中获得了以下信息,似乎我不应该在我的应用程序中获得errno

 /*
    8  * These should never be seen by user programs.  To return one of ERESTART*
    9  * codes, signal_pending() MUST be set.  Note that ptrace can observe these
   10  * at syscall exit tracing, but they will never be left for the debugged user
   11  * process to see.
   12  */
   13 #define ERESTARTSYS 512
   14 #define ERESTARTNOINTR  513
   15 #define ERESTARTNOHAND  514 /* ***restart if no handler..*** */
我检查了内核代码,ERESTARTNOHAND将被翻译成EINTR,似乎永远不会回到用户空间

void do_signal(struct pt_regs *regs)
{
    struct ksignal ksig;

    if (get_signal(&ksig)) {
        /* Whee! Actually deliver the signal.  */
        handle_signal(&ksig, regs);
        return;
    }

    /* Did we come from a system call? */
    if (syscall_get_nr(current, regs) >= 0) {
        /* Restart the system call - no handlers present */
        switch (syscall_get_error(current, regs)) {
        case -ERESTARTNOHAND:
        case -ERESTARTSYS:
        case -ERESTARTNOINTR:
            regs->ax = regs->orig_ax;
            regs->ip -= 2;
            break;

        case -ERESTART_RESTARTBLOCK:
            regs->ax = get_nr_restart_syscall(regs);
            regs->ip -= 2;
            break;
        }
    }

    /*
     * If there's no signal to deliver, we just put the saved sigmask
     * back.
     */
    restore_saved_sigmask();
}

handle_signal(struct ksignal *ksig, struct pt_regs *regs)
{
    bool stepping, failed;
    struct fpu *fpu = &current->thread.fpu;

    if (v8086_mode(regs))
        save_v86_state((struct kernel_vm86_regs *) regs, VM86_SIGNAL);

    /* Are we from a system call? */
    if (syscall_get_nr(current, regs) >= 0) {
        /* If so, check system call restarting.. */
        switch (syscall_get_error(current, regs)) {
        case -ERESTART_RESTARTBLOCK:
        case -ERESTARTNOHAND:
            regs->ax = -EINTR;
            break;
        ......
}
我的问题是:

  • 为什么我会得到errno-Erestrand
  • 当我得到错误时,我该怎么办重试系统调用或不执行任何操作