Does linux allow any system call to be made from signal handlers?

前端 未结 3 821
悲哀的现实
悲哀的现实 2020-12-01 20:37

My understanding is that, in general, the behavior is undefined if you call a non-async signal safe function from a signal handler, but I\'ve heard that linux allows you to

3条回答
  •  天涯浪人
    2020-12-01 21:15

    According to section 2 signal manual:

    See signal(7) for a list of the async-signal-safe functions that can be safely called from inside a signal handler.

    And section 7 signals manual lists the following functions and/or system calls along with a pretty clear description:

    Async-signal-safe functions

       A signal handler function must be very careful, since processing elsewhere may
       be interrupted at some arbitrary point in the execution of the program.  POSIX
       has the concept of "safe function".  If a signal interrupts the execution of
       an unsafe function, and handler calls an unsafe function, then the behavior of
       the program is undefined.
    
       POSIX.1-2004 (also known as POSIX.1-2001 Technical Corrigendum 2) requires an
       implementation to guarantee that the following functions can be safely called
       inside a signal handler:
    
           _Exit()
           _exit()
           abort()
           accept()
           access()
           aio_error()
           aio_return()
           aio_suspend()
           alarm()
           bind()
           cfgetispeed()
           cfgetospeed()
           cfsetispeed()
           cfsetospeed()
           chdir()
           chmod()
           chown()
           clock_gettime()
           close()
           connect()
           creat()
           dup()
           dup2()
           execle()
           execve()
           fchmod()
           fchown()
           fcntl()
           fdatasync()
           fork()
           fpathconf()
           fstat()
           fsync()
           ftruncate()
           getegid()
           geteuid()
           getgid()
           getgroups()
           getpeername()
           getpgrp()
           getpid()
           getppid()
           getsockname()
           getsockopt()
           getuid()
           kill()
           link()
           listen()
           lseek()
           lstat()
           mkdir()
           mkfifo()
           open()
           pathconf()
           pause()
           pipe()
           poll()
           posix_trace_event()
           pselect()
           raise()
           read()
           readlink()
           recv()
           recvfrom()
           recvmsg()
           rename()
           rmdir()
           select()
           sem_post()
           send()
           sendmsg()
           sendto()
           setgid()
           setpgid()
           setsid()
           setsockopt()
           setuid()
           shutdown()
           sigaction()
           sigaddset()
           sigdelset()
           sigemptyset()
           sigfillset()
           sigismember()
           signal()
           sigpause()
           sigpending()
           sigprocmask()
           sigqueue()
           sigset()
           sigsuspend()
           sleep()
           sockatmark()
           socket()
           socketpair()
           stat()
           symlink()
           sysconf()
           tcdrain()
           tcflow()
           tcflush()
           tcgetattr()
           tcgetpgrp()
           tcsendbreak()
           tcsetattr()
           tcsetpgrp()
           time()
           timer_getoverrun()
           timer_gettime()
           timer_settime()
           times()
           umask()
           uname()
           unlink()
           utime()
           wait()
           waitpid()
           write()
    
       POSIX.1-2008 removes fpathconf(), pathconf(), and sysconf() from the above
       list, and adds the following functions:
    
           execl()
           execv()
           faccessat()
           fchmodat()
           fchownat()
           fexecve()
           fstatat()
           futimens()
           linkat()
           mkdirat()
           mkfifoat()
           mknod()
           mknodat()
           openat()
           readlinkat()
           renameat()
           symlinkat()
           unlinkat()
           utimensat()
           utimes()
    

    I believe this information to be more reliable than something that we hear sometimes somewhere . So Linux does allow only some system calls but not all of them. So the answer to your question is simply — no.

提交回复
热议问题