原文:http://blog.chinaunix.net/uid-28458801-id-4630215.html
NAME
syscall - 间接系统调用
SYNOPSIS
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */
int syscall(int number, ...);
DESCRIPTION
syscall() 执行一个系统调用,根据指定的参数number和所有系统调用的汇编语言接口来确定调用哪个系统调用。
系统调用所使用的符号常量可以在头文件<sys/syscll.h>里面找到。
Linux中,每个进程有一个pid,类型pid_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。Linux中的POSIX线程库实现的线程其实也是一个进程(LWP),只是该进程与主进程(启动线程的进程)共享一些资源而已,比如代码段,数据段等。
有时候我们可能需要知道线程的真实pid。比如进程P1要向另外一个进程P2中的某个线程发送信号时,既不能使用P2的pid,更不能使用线程的pthread id,而只能使用该线程的真实pid,称为tid。
有一个函数gettid()可以得到tid,但glibc并没有实现该函数,只能通过Linux的系统调用syscall来获取。
测试实例:
测试结果:测试实例:
点击(此处)折叠或打开
-
#include <unistd.h>
-
#include <sys/syscall.h>
-
#include <sys/types.h>
-
#include <signal.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int
-
main(int argc, char *argv[])
-
{
-
pid_t tid;
-
-
tid = syscall(SYS_gettid);
-
printf("tid : %d\n",tid);
-
-
tid = syscall(SYS_tgkill, getpid(), tid, SIGHUP);
-
printf("tid : %d ...\n",tid);
- }

SYS_*
点击(此处)折叠或打开
-
/* Generated at libc build time from kernel syscall list. */
-
-
#ifndef _SYSCALL_H
-
# error "Never use <bits/syscall.h> directly; include <sys/syscall.h> instead."
-
#endif
-
-
#include <bits/wordsize.h>
-
-
#define SYS__sysctl __NR__sysctl
-
#define SYS_access __NR_access
-
#define SYS_acct __NR_acct
-
#define SYS_add_key __NR_add_key
-
#define SYS_adjtimex __NR_adjtimex
-
#define SYS_afs_syscall __NR_afs_syscall
-
#define SYS_alarm __NR_alarm
-
#define SYS_brk __NR_brk
-
#define SYS_capget __NR_capget
-
#define SYS_capset __NR_capset
-
#define SYS_chdir __NR_chdir
-
#define SYS_chmod __NR_chmod
-
#define SYS_chown __NR_chown
-
#define SYS_chroot __NR_chroot
-
#define SYS_clock_getres __NR_clock_getres
-
#define SYS_clock_gettime __NR_clock_gettime
-
#define SYS_clock_nanosleep __NR_clock_nanosleep
-
#define SYS_clock_settime __NR_clock_settime
-
#define SYS_clone __NR_clone
-
#define SYS_close __NR_close
-
#define SYS_creat __NR_creat
-
#define SYS_create_module __NR_create_module
-
#define SYS_delete_module __NR_delete_module
-
#define SYS_dup __NR_dup
-
#define SYS_dup2 __NR_dup2
-
#define SYS_epoll_create __NR_epoll_create
-
#define SYS_epoll_ctl __NR_epoll_ctl
-
#define SYS_epoll_wait __NR_epoll_wait
-
#define SYS_eventfd __NR_eventfd
-
#define SYS_execve __NR_execve
-
#define SYS_exit __NR_exit
-
#define SYS_exit_group __NR_exit_group
-
#define SYS_faccessat __NR_faccessat
-
#define SYS_fadvise64 __NR_fadvise64
-
#define SYS_fallocate __NR_fallocate
-
#define SYS_fchdir __NR_fchdir
-
#define SYS_fchmod __NR_fchmod
-
#define SYS_fchmodat __NR_fchmodat
-
#define SYS_fchown __NR_fchown
-
#define SYS_fchownat __NR_fchownat
-
#define SYS_fcntl __NR_fcntl
-
#define SYS_fdatasync __NR_fdatasync
-
#define SYS_fgetxattr __NR_fgetxattr
-
#define SYS_flistxattr __NR_flistxattr
-
#define SYS_flock __NR_flock
-
#define SYS_fork __NR_fork
-
#define SYS_fremovexattr __NR_fremovexattr
-
#define SYS_fsetxattr __NR_fsetxattr
-
#define SYS_fstat __NR_fstat
-
#define SYS_fstatfs __NR_fstatfs
-
#define SYS_fsync __NR_fsync
-
#define SYS_ftruncate __NR_ftruncate
-
#define SYS_futex __NR_futex
-
#define SYS_futimesat __NR_futimesat
-
#define SYS_get_kernel_syms __NR_get_kernel_syms
-
#define SYS_get_mempolicy __NR_get_mempolicy
-
#define SYS_get_robust_list __NR_get_robust_list
-
#define SYS_get_thread_area __NR_get_thread_area
-
#define SYS_getcwd __NR_getcwd
-
#define SYS_getdents __NR_getdents
-
#define SYS_getdents64 __NR_getdents64
-
#define SYS_getegid __NR_getegid
-
#define SYS_geteuid __NR_geteuid
-
#define SYS_getgid __NR_getgid
-
#define SYS_getgroups __NR_getgroups
-
#define SYS_getitimer __NR_getitimer
-
#define SYS_getpgid __NR_getpgid
-
#define SYS_getpgrp __NR_getpgrp
-
#define SYS_getpid __NR_getpid
-
#define SYS_getpmsg __NR_getpmsg
-
#define SYS_getppid __NR_getppid
-
#define SYS_getpriority __NR_getpriority
-
#define SYS_getresgid __NR_getresgid
-
#define SYS_getresuid __NR_getresuid
-
#define SYS_getrlimit __NR_getrlimit
-
#define SYS_getrusage __NR_getrusage
-
#define SYS_getsid __NR_getsid
-
#define SYS_gettid __NR_gettid
-
#define SYS_gettimeofday __NR_gettimeofday
-
#define SYS_getuid __NR_getuid
-
#define SYS_getxattr __NR_getxattr
-
#define SYS_init_module __NR_init_module
-
#define SYS_inotify_add_watch __NR_inotify_add_watch
-
#define SYS_inotify_init __NR_inotify_init
-
#define SYS_inotify_rm_watch __NR_inotify_rm_watch
-
#define SYS_io_cancel __NR_io_cancel
-
#define SYS_io_destroy __NR_io_destroy
-
#define SYS_io_getevents __NR_io_getevents
-
#define SYS_io_setup __NR_io_setup
-
#define SYS_io_submit __NR_io_submit
-
#define SYS_ioctl __NR_ioctl
-
#define SYS_ioperm __NR_ioperm
-
#define SYS_iopl __NR_iopl
-
#define SYS_ioprio_get __NR_ioprio_get
-
#define SYS_ioprio_set __NR_ioprio_set
-
#define SYS_kexec_load __NR_kexec_load
-
#define SYS_keyctl __NR_keyctl
-
#define SYS_kill __NR_kill
-
#define SYS_lchown __NR_lchown
-
#define SYS_lgetxattr __NR_lgetxattr
-
#define SYS_link __NR_link
-
#define SYS_linkat __NR_linkat
-
#define SYS_listxattr __NR_listxattr
-
#define SYS_llistxattr __NR_llistxattr
-
#define SYS_lookup_dcookie __NR_lookup_dcookie
-
#define SYS_lremovexattr __NR_lremovexattr
-
#define SYS_lseek __NR_lseek
-
#define SYS_lsetxattr __NR_lsetxattr
-
#define SYS_lstat __NR_lstat
-
#define SYS_madvise __NR_madvise
-
#define SYS_mbind __NR_mbind
-
#define SYS_migrate_pages __NR_migrate_pages
-
#define SYS_mincore __NR_mincore
-
#define SYS_mkdir __NR_mkdir
-
#define SYS_mkdirat __NR_mkdirat
-
#define SYS_mknod __NR_mknod
-
#define SYS_mknodat __NR_mknodat
-
#define SYS_mlock __NR_mlock
-
#define SYS_mlockall __NR_mlockall
-
#define SYS_mmap __NR_mmap
-
#define SYS_modify_ldt __NR_modify_ldt
-
#define SYS_mount __NR_mount
-
#define SYS_move_pages __NR_move_pages
-
#define SYS_mprotect __NR_mprotect
-
#define SYS_mq_getsetattr __NR_mq_getsetattr
-
#define SYS_mq_notify __NR_mq_notify
-
#define SYS_mq_open __NR_mq_open
-
#define SYS_mq_timedreceive __NR_mq_timedreceive
-
#define SYS_mq_timedsend __NR_mq_timedsend
-
#define SYS_mq_unlink __NR_mq_unlink
-
#define SYS_mremap __NR_mremap
-
#define SYS_msync __NR_msync
-
#define SYS_munlock __NR_munlock
-
#define SYS_munlockall __NR_munlockall
-
#define SYS_munmap __NR_munmap
-
#define SYS_nanosleep __NR_nanosleep
-
#define SYS_nfsservctl __NR_nfsservctl
-
#define SYS_open __NR_open
-
#define SYS_openat __NR_openat
-
#define SYS_pause __NR_pause
-
#define SYS_personality __NR_personality
-
#define SYS_pipe __NR_pipe
-
#define SYS_pivot_root __NR_pivot_root
-
#define SYS_poll __NR_poll
-
#define SYS_ppoll __NR_ppoll
-
#define SYS_prctl __NR_prctl
-
#define SYS_pread64 __NR_pread64
-
#define SYS_pselect6 __NR_pselect6
-
#define SYS_ptrace __NR_ptrace
-
#define SYS_putpmsg __NR_putpmsg
-
#define SYS_pwrite64 __NR_pwrite64
-
#define SYS_query_module __NR_query_module
-
#define SYS_quotactl __NR_quotactl
-
#define SYS_read __NR_read
-
#define SYS_readahead __NR_readahead
-
#define SYS_readlink __NR_readlink
-
#define SYS_readlinkat __NR_readlinkat
-
#define SYS_readv __NR_readv
-
#define SYS_reboot __NR_reboot
-
#define SYS_remap_file_pages __NR_remap_file_pages
-
#define SYS_removexattr __NR_removexattr
-
#define SYS_rename __NR_rename
-
#define SYS_renameat __NR_renameat
-
#define SYS_request_key __NR_request_key
-
#define SYS_restart_syscall __NR_restart_syscall
-
#define SYS_rmdir __NR_rmdir
-
#define SYS_rt_sigaction __NR_rt_sigaction
-
#define SYS_rt_sigpending __NR_rt_sigpending
-
#define SYS_rt_sigprocmask __NR_rt_sigprocmask
-
#define SYS_rt_sigqueueinfo __NR_rt_sigqueueinfo
-
#define SYS_rt_sigreturn __NR_rt_sigreturn
-
#define SYS_rt_sigsuspend __NR_rt_sigsuspend
-
#define SYS_rt_sigtimedwait __NR_rt_sigtimedwait
-
#define SYS_sched_get_priority_max __NR_sched_get_priority_max
-
#define SYS_sched_get_priority_min __NR_sched_get_priority_min
-
#define SYS_sched_getaffinity __NR_sched_getaffinity
-
#define SYS_sched_getparam __NR_sched_getparam
-
#define SYS_sched_getscheduler __NR_sched_getscheduler
-
#define SYS_sched_rr_get_interval __NR_sched_rr_get_interval
-
#define SYS_sched_setaffinity __NR_sched_setaffinity
-
#define SYS_sched_setparam __NR_sched_setparam
-
#define SYS_sched_setscheduler __NR_sched_setscheduler
-
#define SYS_sched_yield __NR_sched_yield
-
#define SYS_select __NR_select
-
#define SYS_sendfile __NR_sendfile
-
#define SYS_set_mempolicy __NR_set_mempolicy
-
#define SYS_set_robust_list __NR_set_robust_list
-
#define SYS_set_thread_area __NR_set_thread_area
-
#define SYS_set_tid_address __NR_set_tid_address
-
#define SYS_setdomainname __NR_setdomainname
-
#define SYS_setfsgid __NR_setfsgid
-
#define SYS_setfsuid __NR_setfsuid
-
#define SYS_setgid __NR_setgid
-
#define SYS_setgroups __NR_setgroups
-
#define SYS_sethostname __NR_sethostname
-
#define SYS_setitimer __NR_setitimer
-
#define SYS_setpgid __NR_setpgid
-
#define SYS_setpriority __NR_setpriority
-
#define SYS_setregid __NR_setregid
-
#define SYS_setresgid __NR_setresgid
-
#define SYS_setresuid __NR_setresuid
-
#define SYS_setreuid __NR_setreuid
-
#define SYS_setrlimit __NR_setrlimit
-
#define SYS_setsid __NR_setsid
-
#define SYS_settimeofday __NR_settimeofday
-
#define SYS_setuid __NR_setuid
-
#define SYS_setxattr __NR_setxattr
-
#define SYS_sigaltstack __NR_sigaltstack
-
#define SYS_splice __NR_splice
-
#define SYS_stat __NR_stat
-
#define SYS_statfs __NR_statfs
-
#define SYS_swapoff __NR_swapoff
-
#define SYS_swapon __NR_swapon
-
#define SYS_symlink __NR_symlink
-
#define SYS_symlinkat __NR_symlinkat
-
#define SYS_sync __NR_sync
-
#define SYS_sync_file_range __NR_sync_file_range
-
#define SYS_sysfs __NR_sysfs
-
#define SYS_sysinfo __NR_sysinfo
-
#define SYS_syslog __NR_syslog
-
#define SYS_tee __NR_tee
-
#define SYS_tgkill __NR_tgkill
-
#define SYS_time __NR_time
-
#define SYS_timer_create __NR_timer_create
-
#define SYS_timer_delete __NR_timer_delete
-
#define SYS_timer_getoverrun __NR_timer_getoverrun
-
#define SYS_timer_gettime __NR_timer_gettime
-
#define SYS_timer_settime __NR_timer_settime
-
#define SYS_times __NR_times
-
#define SYS_tkill __NR_tkill
-
#define SYS_truncate __NR_truncate
-
#define SYS_umask __NR_umask
-
#define SYS_umount2 __NR_umount2
-
#define SYS_uname __NR_uname
-
#define SYS_unlink __NR_unlink
-
#define SYS_unlinkat __NR_unlinkat
-
#define SYS_unshare __NR_unshare
-
#define SYS_uselib __NR_uselib
-
#define SYS_ustat __NR_ustat
-
#define SYS_utime __NR_utime
-
#define SYS_utimes __NR_utimes
-
#define SYS_vfork __NR_vfork
-
#define SYS_vhangup __NR_vhangup
-
#define SYS_vmsplice __NR_vmsplice
-
#define SYS_vserver __NR_vserver
-
#define SYS_wait4 __NR_wait4
-
#define SYS_waitid __NR_waitid
-
#define SYS_write __NR_write
-
#define SYS_writev __NR_writev
-
#if __WORDSIZE == 64
-
#define SYS_accept __NR_accept
-
#define SYS_arch_prctl __NR_arch_prctl
-
#define SYS_bind __NR_bind
-
#define SYS_connect __NR_connect
-
#define SYS_epoll_ctl_old __NR_epoll_ctl_old
-
#define SYS_epoll_pwait __NR_epoll_pwait
-
#define SYS_epoll_wait_old __NR_epoll_wait_old
-
#define SYS_getpeername __NR_getpeername
-
#define SYS_getsockname __NR_getsockname
-
#define SYS_getsockopt __NR_getsockopt
-
#define SYS_listen __NR_listen
-
#define SYS_msgctl __NR_msgctl
-
#define SYS_msgget __NR_msgget
-
#define SYS_msgrcv __NR_msgrcv
-
#define SYS_msgsnd __NR_msgsnd
-
#define SYS_newfstatat __NR_newfstatat
-
#define SYS_recvfrom __NR_recvfrom
-
#define SYS_recvmsg __NR_recvmsg
-
#define SYS_security __NR_security
-
#define SYS_semctl __NR_semctl
-
#define SYS_semget __NR_semget
-
#define SYS_semop __NR_semop
-
#define SYS_semtimedop __NR_semtimedop
-
#define SYS_sendmsg __NR_sendmsg
-
#define SYS_sendto __NR_sendto
-
#define SYS_setsockopt __NR_setsockopt
-
#define SYS_shmat __NR_shmat
-
#define SYS_shmctl __NR_shmctl
-
#define SYS_shmdt __NR_shmdt
-
#define SYS_shmget __NR_shmget
-
#define SYS_shutdown __NR_shutdown
-
#define SYS_signalfd __NR_signalfd
-
#define SYS_socket __NR_socket
-
#define SYS_socketpair __NR_socketpair
-
#define SYS_timerfd_create __NR_timerfd_create
-
#define SYS_tuxcall __NR_tuxcall
-
#define SYS_utimensat __NR_utimensat
-
#else
-
#define SYS__llseek __NR__llseek
-
#define SYS__newselect __NR__newselect
-
#define SYS_bdflush __NR_bdflush
-
#define SYS_break __NR_break
-
#define SYS_chown32 __NR_chown32
-
#define SYS_fadvise64_64 __NR_fadvise64_64
-
#define SYS_fchown32 __NR_fchown32
-
#define SYS_fcntl64 __NR_fcntl64
-
#define SYS_fstat64 __NR_fstat64
-
#define SYS_fstatat64 __NR_fstatat64
-
#define SYS_fstatfs64 __NR_fstatfs64
-
#define SYS_ftime __NR_ftime
-
#define SYS_ftruncate64 __NR_ftruncate64
-
#define SYS_getcpu __NR_getcpu
-
#define SYS_getegid32 __NR_getegid32
-
#define SYS_geteuid32 __NR_geteuid32
-
#define SYS_getgid32 __NR_getgid32
-
#define SYS_getgroups32 __NR_getgroups32
-
#define SYS_getresgid32 __NR_getresgid32
-
#define SYS_getresuid32 __NR_getresuid32
-
#define SYS_getuid32 __NR_getuid32
-
#define SYS_gtty __NR_gtty
-
#define SYS_idle __NR_idle
-
#define SYS_ipc __NR_ipc
-
#define SYS_lchown32 __NR_lchown32
-
#define SYS_lock __NR_lock
-
#define SYS_lstat64 __NR_lstat64
-
#define SYS_madvise1 __NR_madvise1
-
#define SYS_mmap2 __NR_mmap2
-
#define SYS_mpx __NR_mpx
-
#define SYS_nice __NR_nice
-
#define SYS_oldfstat __NR_oldfstat
-
#define SYS_oldlstat __NR_oldlstat
-
#define SYS_oldolduname __NR_oldolduname
-
#define SYS_oldstat __NR_oldstat
-
#define SYS_olduname __NR_olduname
-
#define SYS_prof __NR_prof
-
#define SYS_profil __NR_profil
-
#define SYS_readdir __NR_readdir
-
#define SYS_sendfile64 __NR_sendfile64
-
#define SYS_setfsgid32 __NR_setfsgid32
-
#define SYS_setfsuid32 __NR_setfsuid32
-
#define SYS_setgid32 __NR_setgid32
-
#define SYS_setgroups32 __NR_setgroups32
-
#define SYS_setregid32 __NR_setregid32
-
#define SYS_setresgid32 __NR_setresgid32
-
#define SYS_setresuid32 __NR_setresuid32
-
#define SYS_setreuid32 __NR_setreuid32
-
#define SYS_setuid32 __NR_setuid32
-
#define SYS_sgetmask __NR_sgetmask
-
#define SYS_sigaction __NR_sigaction
-
#define SYS_signal __NR_signal
-
#define SYS_sigpending __NR_sigpending
-
#define SYS_sigprocmask __NR_sigprocmask
-
#define SYS_sigreturn __NR_sigreturn
-
#define SYS_sigsuspend __NR_sigsuspend
-
#define SYS_socketcall __NR_socketcall
-
#define SYS_ssetmask __NR_ssetmask
-
#define SYS_stat64 __NR_stat64
-
#define SYS_statfs64 __NR_statfs64
-
#define SYS_stime __NR_stime
-
#define SYS_stty __NR_stty
-
#define SYS_truncate64 __NR_truncate64
-
#define SYS_ugetrlimit __NR_ugetrlimit
-
#define SYS_ulimit __NR_ulimit
-
#define SYS_umount __NR_umount
-
#define SYS_vm86 __NR_vm86
-
#define SYS_vm86old __NR_vm86old
-
#define SYS_waitpid __NR_waitpid
- #endif