类型定义 | |
typedef int(* | PollFun) (struct pollfd *fds, nfds_t nfds, int timeout) |
函数 | |
unsigned int | SysGetGroupId (void) |
unsigned int | SysGetTid (void) |
获取当前任务ID 更多... | |
void | SysSchedYield (int type) |
int | SysSchedGetScheduler (int id, int flag) |
int | SysSchedSetScheduler (int id, int policy, int prio, int flag) |
int | SysSchedGetParam (int id, int flag) |
int | SysSchedSetParam (int id, unsigned int prio, int flag) |
int | SysSetProcessPriority (int which, int who, unsigned int prio) |
int | SysGetProcessPriority (int which, int who) |
int | SysSchedGetPriorityMin (int policy) |
int | SysSchedGetPriorityMax (int policy) |
int | SysSchedRRGetInterval (int pid, struct timespec *tp) |
int | SysWait (int pid, USER int *status, int options, void *rusage) |
int | SysWaitid (idtype_t type, int pid, USER siginfo_t *info, int options, void *rusage) |
int | SysFork (void) |
int | SysVfork (void) |
unsigned int | SysGetPID (void) |
unsigned int | SysGetPPID (void) |
int | SysSetGroupID (unsigned int gid) |
int | SysGetGroupID (void) |
int | SysGetUserID (void) |
获取用户ID 更多... | |
int | SysGetEffUserID (void) |
int | SysGetEffGID (void) |
int | SysSetUserID (int uid) |
int | SysGetRealEffSaveUserID (int *ruid, int *euid, int *suid) |
int | SysGetRealEffSaveGroupID (int *rgid, int *egid, int *sgid) |
int | SysSetRealEffUserID (int ruid, int euid) |
int | SysSetRealEffGroupID (int rgid, int egid) |
int | SysSetRealEffSaveGroupID (int rgid, int egid, int sgid) |
int | SysSetRealEffSaveUserID (int ruid, int euid, int suid) |
int | SysGetGroups (int size, int list[]) |
int | SysSetGroups (int size, int list[]) |
int | SysGetCurrProcessGroupID (void) |
获取当前进程组ID 更多... | |
int | SysGetProcessGroupID (unsigned int pid) |
获取指定进程的组ID,为0时返回当前进程ID 更多... | |
int | SysSetProcessGroupID (unsigned int pid, unsigned int gid) |
为指定进程设置进程组ID 更多... | |
unsigned int | SysCreateUserThread (const TSK_ENTRY_FUNC func, const UserTaskParam *userParam, bool joinable) |
int | SysSetThreadArea (const char *area) |
char * | SysGetThreadArea (void) |
int | SysUserThreadSetDetach (unsigned int taskID) |
int | SysUserThreadDetach (unsigned int taskID) |
int | SysThreadJoin (unsigned int taskID) |
void | SysUserExitGroup (int status) |
void | SysThreadExit (int status) |
int | SysFutex (const unsigned int *uAddr, unsigned int flags, int val, unsigned int absTime, const unsigned int *newUserAddr) |
SysFutex 操作用户态快速互斥锁 系统调用 更多... | |
int | SysSchedGetAffinity (int id, unsigned int *cpuset, int flag) |
int | SysSchedSetAffinity (int id, const unsigned short cpuset, int flag) |
mqd_t | SysMqOpen (const char *mqName, int openFlag, mode_t mode, struct mq_attr *attr) |
打开一个消息队列,由posix接口封装 更多... | |
int | SysMqClose (mqd_t personal) |
关闭一个消息队列 更多... | |
int | SysMqGetSetAttr (mqd_t mqd, const struct mq_attr *new, struct mq_attr *old) |
封装posix的标准接口,获取和设置消息队列的属性 更多... | |
int | SysMqUnlink (const char *mqName) |
int | SysMqSend (mqd_t personal, const char *msgPtr, size_t msgLen, unsigned int msgPrio) |
int | SysMqTimedSend (mqd_t personal, const char *msg, size_t msgLen, unsigned int msgPrio, const struct timespec *absTimeout) |
定时时间发送消息,任务将被阻塞,等待被唤醒写入消息 更多... | |
ssize_t | SysMqTimedReceive (mqd_t personal, char *msg, size_t msgLen, unsigned int *msgPrio, const struct timespec *absTimeout) |
定时接收消息,任务将被阻塞,等待被唤醒读取 更多... | |
int | SysMqNotify (mqd_t personal, const struct sigevent *sigev) |
int | SysSigAction (int sig, const sigaction_t *restrict sa, sigaction_t *restrict old, size_t sigsetsize) |
注册信号,鸿蒙内核只捕捉了SIGSYS 信号 更多... | |
int | SysSigprocMask (int how, const sigset_t_l *restrict setl, sigset_t_l *restrict oldl, size_t sigsetsize) |
系统调用之进程信号屏蔽, 什么意思?简单说就是 一个信号来了进程要不要处理,屏蔽就是不处理,注意不能屏蔽SIGKILL和SIGSTOP信号,必须要处理. 更多... | |
int | SysKill (pid_t pid, int sig) |
系统调用之向进程发送信号 更多... | |
int | SysPthreadKill (pid_t pid, int sig) |
系统调用之之向进程发送信号 更多... | |
int | SysSigTimedWait (const sigset_t_l *setl, siginfo_t *info, const struct timespec *timeout, size_t sigsetsize) |
int | SysPause (void) |
系统调用之暂停任务 更多... | |
int | SysSigPending (sigset_t_l *setl) |
获取阻塞当前任务的信号集 更多... | |
int | SysSigSuspend (sigset_t_l *setl) |
int | SysMkFifo (const char *pathName, mode_t mode) |
int | SysSocket (int domain, int type, int protocol) |
int | SysBind (int s, const struct sockaddr *name, socklen_t namelen) |
int | SysConnect (int s, const struct sockaddr *name, socklen_t namelen) |
int | SysListen (int sockfd, int backlog) |
int | SysAccept (int socket, struct sockaddr *address, socklen_t *addressLen) |
int | SysGetSockName (int s, struct sockaddr *name, socklen_t *namelen) |
int | SysGetPeerName (int s, struct sockaddr *name, socklen_t *namelen) |
ssize_t | SysSend (int s, const void *dataptr, size_t size, int flags) |
ssize_t | SysSendTo (int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen) |
ssize_t | SysRecv (int socket, void *buffer, size_t length, int flags) |
ssize_t | SysRecvFrom (int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *addressLen) |
int | SysShutdown (int socket, int how) |
int | SysSetSockOpt (int socket, int level, int optName, const void *optValue, socklen_t optLen) |
int | SysGetSockOpt (int sockfd, int level, int optName, void *optValue, socklen_t *optLen) |
ssize_t | SysSendMsg (int s, const struct msghdr *message, int flags) |
ssize_t | SysRecvMsg (int s, struct msghdr *message, int flags) |
void * | SysMmap (void *addr, size_t size, int prot, int flags, int fd, size_t offset) |
系统调用|申请虚拟内存(分配线性地址区间) 鸿蒙与Linux标准库的差异 http://weharmonyos.com/zh-cn/device-dev/kernel/%E4%B8%8ELinux%E6%A0%87%E5%87%86%E5%BA%93%E7%9A%84%E5%B7%AE%E5%BC%82/ 更多... | |
int | SysMunmap (void *addr, size_t size) |
释放虚拟内存 更多... | |
int | SysMprotect (void *vaddr, size_t len, int prot) |
修改访问权限 更多... | |
void * | SysMremap (void *oldAddr, size_t oldLen, size_t newLen, int flags, void *newAddr) |
void * | SysBrk (void *addr) |
brk也是申请堆内存的一种方式,一般小于 128K 会使用它 更多... | |
int | SysShmGet (key_t key, size_t size, int shmflg) |
得到一个共享内存标识符或创建一个共享内存对象 更多... | |
void * | SysShmAt (int shmid, const void *shmaddr, int shmflg) |
int | SysShmCtl (int shmid, int cmd, struct shmid_ds *buf) |
完成对共享内存的控制 此函数可以对shmid指定的共享存储进行多种操作(删除、取信息、加锁、解锁等) 更多... | |
int | SysShmDt (const void *shmaddr) |
与shmat函数相反,是用来断开与共享内存附加点的地址,禁止本进程访问此片共享内存 更多... | |
int | SysUname (struct utsname *name) |
int | SysInfo (struct sysinfo *info) |
系统信息 更多... | |
int | SysNanoSleep (const struct timespec *rqtp, struct timespec *rmtp) |
clock_t | SysTimes (struct tms *buf) |
time_t | SysTime (time_t *tloc) |
int | SysSetiTimer (int which, const struct itimerval *value, struct itimerval *ovalue) |
int | SysGetiTimer (int which, struct itimerval *value) |
int | SysTimerCreate (clockid_t clockID, struct ksigevent *evp, timer_t *timerID) |
int | SysTimerGettime (timer_t timerID, struct itimerspec *value) |
int | SysTimerGetoverrun (timer_t timerID) |
int | SysTimerDelete (timer_t timerID) |
int | SysClockSettime (clockid_t clockID, const struct timespec *tp) |
int | SysClockGettime (clockid_t clockID, struct timespec *tp) |
获取系统时间 更多... | |
int | SysClockGetres (clockid_t clockID, struct timespec *tp) |
int | SysClockNanoSleep (clockid_t clk, int flags, const struct timespec *req, struct timespec *rem) |
int | SysUtime (const char *path, const struct utimbuf *ptimes) |
int | SysTimerSettime (timer_t timerID, int flags, const struct itimerspec *value, struct itimerspec *oldValue) |
int | SysClockSettime64 (clockid_t clockID, const struct timespec64 *tp) |
int | SysClockGettime64 (clockid_t clockID, struct timespec64 *tp) |
int | SysClockGetres64 (clockid_t clockID, struct timespec64 *tp) |
int | SysClockNanoSleep64 (clockid_t clk, int flags, const struct timespec64 *req, struct timespec64 *rem) |
int | SysTimerGettime64 (timer_t timerID, struct itimerspec64 *value) |
int | SysTimerSettime64 (timer_t timerID, int flags, const struct itimerspec64 *value, struct itimerspec64 *oldValue) |
int | fp_open (char *fullpath, int oflags, mode_t mode) |
int | do_open (int dirfd, const char *path, int oflags, mode_t mode) |
int | do_unlink (int dirfd, const char *pathname) |
int | do_mkdir (int dirfd, const char *pathname, mode_t mode) |
int | do_rmdir (int dirfd, const char *pathname) |
int | do_rename (int oldfd, const char *oldpath, int newfd, const char *newpath) |
int | do_select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout, PollFun poll) |
int | do_readdir (int fd, struct dirent **de, unsigned int count) |
ssize_t | preadv (int __fd, const struct iovec *__iov, int __count, off_t __offset) |
ssize_t | pwritev (int __fd, const struct iovec *__iov, int __count, off_t __offset) |
int | chattr (const char *pathname, struct IATTR *attr) |
int | SysClose (int fd) |
ssize_t | SysRead (int fd, void *buf, size_t nbytes) |
系统调用|读文件:从文件中读取nbytes长度的内容到buf中(用户空间) 更多... | |
ssize_t | SysWrite (int fd, const void *buf, size_t nbytes) |
系统调用|写文件:将buf中(用户空间)nbytes长度的内容写到文件中 更多... | |
int | SysOpen (const char *path, int oflags,...) |
系统调用|打开文件, 正常情况下返回进程的FD值 更多... | |
int | SysCreat (const char *pathname, mode_t mode) |
创建文件,从实现看 SysCreat 和 SysOpen 并没有太大的区别,只有打开方式的区别 SysCreat函数完全可以被SysOpen函数替代 更多... | |
int | SysLink (const char *path1, const char *path2) |
ssize_t | SysReadlink (const char *pathname, char *buf, size_t bufsize) |
int | SysSymlink (const char *target, const char *linkpath) |
int | SysLinkat (int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags) |
int | SysSymlinkat (const char *target, int dirfd, const char *linkpath) |
ssize_t | SysReadlinkat (int dirfd, const char *pathname, char *buf, size_t bufsize) |
int | SysUnlink (const char *pathname) |
删除链:删除由装入点管理的文件 更多... | |
int | SysExecve (const char *fileName, char *const *argv, char *const *envp) |
动态加载程序过程 更多... | |
int | SysFchdir (int fd) |
int | SysChdir (const char *path) |
int | SysUtimensat (int fd, const char *path, struct timespec times[2], int flag) |
int | SysFchmodat (int fd, const char *path, mode_t mode, int flag) |
int | SysFchmod (int fd, mode_t mode) |
int | SysChmod (const char *path, mode_t mode) |
int | SysFchownat (int fd, const char *path, uid_t owner, gid_t group, int flag) |
int | SysFchown (int fd, uid_t owner, gid_t group) |
int | SysChown (const char *pathname, uid_t owner, gid_t group) |
off_t | SysLseek (int fd, off_t offset, int whence) |
移动文件指针 更多... | |
off64_t | SysLseek64 (int fd, int offsetHigh, int offsetLow, off64_t *result, int whence) |
int | SysMount (const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data) |
SysMount 挂载文件系统 挂载是指将一个存储设备挂接到一个已存在的路径上。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的路径上, 然后通过这个路径来访问存储设备。如果只有一个存储设备,则可以直接挂载到根目录 / 上,变成根文件系统 更多... | |
int | SysUmount (const char *target) |
卸载文件系统,当某个文件系统不需要再使用了,那么可以将它卸载掉。 更多... | |
int | SysAccess (const char *path, int amode) |
确定文件的可存取性 更多... | |
int | SysFaccessat (int fd, const char *filename, int amode, int flag) |
int | SysRename (const char *oldpath, const char *newpath) |
重命名文件 更多... | |
int | SysMkdir (const char *pathname, mode_t mode) |
创建目录 更多... | |
int | SysRmdir (const char *pathname) |
删除目录 更多... | |
int | SysDup (int fd) |
int | SysUmount2 (const char *target, int flags) |
卸载文件系统 更多... | |
int | SysIoctl (int fd, int req, void *arg) |
I/O总控制函数 更多... | |
int | SysFcntl (int fd, int cmd, void *arg) |
int | SysDup2 (int fd1, int fd2) |
复制文件描述符 更多... | |
int | SysSelect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) |
SysSelect 系统调用|文件系统|select .鸿蒙liteos目前也支持epoll方式 更多... | |
int | SysPselect6 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const long data[2]) |
int | SysTruncate (const char *path, off_t length) |
系统调用|文件系统|截断功能 更多... | |
int | SysFtruncate (int fd, off_t length) |
系统调用|文件系统|截断功能 更多... | |
int | SysStatfs (const char *path, struct statfs *buf) |
获取指定路径下文件的文件系统信息 更多... | |
int | SysStatfs64 (const char *path, size_t sz, struct statfs *buf) |
获取文件系统信息 更多... | |
int | SysFstatfs (int fd, struct statfs *buf) |
int | SysFstatfs64 (int fd, size_t sz, struct statfs *buf) |
int | SysStat (const char *path, struct kstat *buf) |
获取文件状态信息 更多... | |
int | SysLstat (const char *path, struct kstat *buffer) |
参见SysStat 更多... | |
int | SysFstat (int fields, struct kstat *buf) |
参见SysStat 更多... | |
int | SysStatx (int fd, const char *restrict path, int flag, unsigned mask, struct statx *restrict stx) |
int | SysFsync (int fd) |
把文件在内存中的部分写回磁盘 更多... | |
ssize_t | SysReadv (int fd, const struct iovec *iov, int iovcnt) |
通过FD读入数据到缓冲数组中,fd为进程描述符 更多... | |
ssize_t | SysWritev (int fd, const struct iovec *iov, int iovcnt) |
将缓冲数组里的数据写入文件 更多... | |
int | SysPipe (int pipefd[2]) |
int | SysFormat (const char *dev, int sectors, int option) |
int | SysFstat64 (int fd, struct kstat *buf) |
int | SysFstatat64 (int fd, const char *restrict path, struct kstat *restrict buf, int flag) |
int | SysFcntl64 (int fd, int cmd, void *arg) |
int | SysPoll (struct pollfd *fds, nfds_t nfds, int timeout) |
SysPoll I/O多路转换 更多... | |
int | SysPpoll (struct pollfd *fds, nfds_t nfds, const struct timespec *tmo_p, const sigset_t *sigmask, int nsig) |
int | SysPrctl (int option,...) |
对进程进行特定操作 更多... | |
ssize_t | SysPread64 (int fd, void *buf, size_t nbytes, off64_t offset) |
对进程进行特定操作 更多... | |
ssize_t | SysPwrite64 (int fd, const void *buf, size_t nbytes, off64_t offset) |
int | SysEpollCreate (int size) |
int | SysEpollCreate1 (int size) |
int | SysEpollCtl (int epfd, int op, int fd, struct epoll_event *ev) |
int | SysEpollWait (int epfd, struct epoll_event *evs, int maxevents, int timeout) |
int | SysEpollPwait (int epfd, struct epoll_event *evs, int maxevents, int timeout, const sigset_t *mask) |
char * | SysGetcwd (char *buf, size_t n) |
ssize_t | SysSendFile (int outfd, int infd, off_t *offset, size_t count) |
int | SysTruncate64 (const char *path, off64_t length) |
系统调用|文件系统|截断功能 更多... | |
int | SysFtruncate64 (int fd, off64_t length) |
int | SysOpenat (int dirfd, const char *path, int oflags,...) |
int | SysMkdirat (int dirfd, const char *pathname, mode_t mode) |
int | SysUnlinkat (int dirfd, const char *pathname, int flag) |
int | SysRenameat (int oldfd, const char *oldpath, int newdfd, const char *newpath) |
int | SysFallocate (int fd, int mode, off_t offset, off_t len) |
int | SysFallocate64 (int fd, int mode, off64_t offset, off64_t len) |
ssize_t | SysPreadv (int fd, const struct iovec *iov, int iovcnt, long loffset, long hoffset) |
ssize_t | SysPwritev (int fd, const struct iovec *iov, int iovcnt, long loffset, long hoffset) |
void | SysSync (void) |
将内存缓冲区数据写回硬盘 更多... | |
int | SysGetdents64 (int fd, struct dirent *de_user, unsigned int count) |
int | do_opendir (const char *path, int oflags) |
char * | SysRealpath (const char *path, char *resolvedPath) |
int | SysUmask (int mask) |
int | SysShellExec (const char *msgName, const char *cmdString) |
执行 shell 命令 更多... | |
int | SysReboot (int magic, int magic2, int type) |
重启系统 更多... | |
int | SysGetrusage (int what, struct rusage *ru) |
long | SysSysconf (int name) |
系统配置 更多... | |
int | SysUgetrlimit (int resource, unsigned long long k_rlim[2]) |
int | SysSetrlimit (int resource, unsigned long long k_rlim[2]) |
什么情况下会发生从用户态向内核态切换。这里细分为3种情况: 1、发生系统调用时 这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用 申请使用操作系统提供的系统调用服务例程来处理任务。而系统调用的机制,其核心仍 是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断。 2、产生异常时 当CPU执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前 运行的进程切换到处理此异常的内核相关的程序中,也就是转到了内核态,如缺页异常。 3、外设产生中断时 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下 一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是 用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。 比如硬盘读写操作的完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。 可以看到上述三种由用户态切换到内核态的情况中,只有系统调用是进程主动请求发生切换的, 中断和异常都是被动的。 https://blog.csdn.net/piyongduo3393/article/details/89378243
在文件 los_syscall.h 中定义.
在文件 los_syscall.h 第 237 行定义.
在文件 vfs_chattr.c 第 58 行定义.
int do_select | ( | int | nfds, |
fd_set * | readfds, | ||
fd_set * | writefds, | ||
fd_set * | exceptfds, | ||
struct timeval * | timeout, | ||
PollFun | poll | ||
) |
在文件 vfs_preadv.c 第 47 行定义.
在文件 vfs_pwritev.c 第 47 行定义.
确定文件的可存取性
在文件 fs_syscall.c 第 762 行定义.
int SysChdir | ( | const char * | path | ) |
int SysChown | ( | const char * | pathname, |
uid_t | owner, | ||
gid_t | group | ||
) |
int SysClockGetres | ( | clockid_t | clockID, |
struct timespec * | tp | ||
) |
在文件 time_syscall.c 第 308 行定义.
int SysClockGetres64 | ( | clockid_t | clockID, |
struct timespec64 * | tp | ||
) |
int SysClockGettime | ( | clockid_t | clockID, |
struct timespec * | tp | ||
) |
获取系统时间
在文件 time_syscall.c 第 285 行定义.
int SysClockGettime64 | ( | clockid_t | clockID, |
struct timespec64 * | tp | ||
) |
int SysClockNanoSleep | ( | clockid_t | clk, |
int | flags, | ||
const struct timespec * | req, | ||
struct timespec * | rem | ||
) |
在文件 time_syscall.c 第 331 行定义.
int SysClockNanoSleep64 | ( | clockid_t | clk, |
int | flags, | ||
const struct timespec64 * | req, | ||
struct timespec64 * | rem | ||
) |
int SysClockSettime | ( | clockid_t | clockID, |
const struct timespec * | tp | ||
) |
int SysClockSettime64 | ( | clockid_t | clockID, |
const struct timespec64 * | tp | ||
) |
在文件 fs_syscall.c 第 236 行定义.
创建文件,从实现看 SysCreat 和 SysOpen 并没有太大的区别,只有打开方式的区别
SysCreat函数完全可以被SysOpen函数替代
pathname | |
mode | 常用标签如下: O_CREAT:若文件存在,此标志无用;若不存在,建新文件 O_TRUNC:若文件存在,则长度被截为0,属性不变 O_WRONLY:写文件 O_RDONLY:读文件 O_BINARY:此标志可显示地给出以二进制方式打开文件 O_TEXT :此标志可用于显示地给出以文本方式打开文件 O_RDWR :即读也写 O_APPEND:即读也写,但每次写总是在文件尾添加 * |
在文件 fs_syscall.c 第 372 行定义.
unsigned int SysCreateUserThread | ( | const TSK_ENTRY_FUNC | func, |
const UserTaskParam * | userParam, | ||
bool | joinable | ||
) |
在文件 process_syscall.c 第 882 行定义.
复制文件描述符
在文件 fs_syscall.c 第 1038 行定义.
int SysEpollCtl | ( | int | epfd, |
int | op, | ||
int | fd, | ||
struct epoll_event * | ev | ||
) |
int SysEpollPwait | ( | int | epfd, |
struct epoll_event * | evs, | ||
int | maxevents, | ||
int | timeout, | ||
const sigset_t * | mask | ||
) |
在文件 fs_syscall.c 第 2810 行定义.
int SysEpollWait | ( | int | epfd, |
struct epoll_event * | evs, | ||
int | maxevents, | ||
int | timeout | ||
) |
int SysExecve | ( | const char * | fileName, |
char *const * | argv, | ||
char *const * | envp | ||
) |
动态加载程序过程
在文件 fs_syscall.c 第 548 行定义.
在文件 fs_syscall.c 第 2566 行定义.
在文件 fs_syscall.c 第 2081 行定义.
在文件 fs_syscall.c 第 2400 行定义.
在文件 fs_syscall.c 第 2361 行定义.
在文件 fs_syscall.c 第 2461 行定义.
用来修改已经打开文件的属性的函数包含5个功能: 1.复制一个已有文件描述符,功能和dup和dup2相同,对应的cmd:F_DUPFD、F_DUPFD_CLOEXEC。 当使用这两个cmd时,需要传入第三个参数,fcntl返回复制后的文件描述符,此返回值是之前未被占用的描述符, 并且必须一个大于等于第三个参数值。 F_DUPFD命令要求返回的文件描述符会清除对应的FD_CLOEXEC F_DUPFD_CLOEXEC要求设置新描述符的FD_CLOEXEC标志。 2.获取、设置文件描述符标志,对应的cmd:F_GETFD、F_SETFD。 用于设置FD_CLOEXEC标志,此标志的含义是:当进程执行exec系统调用后此文件描述符会被自动关闭。 3.获取、设置文件访问状态标志,对应的cmd:F_GETFL、F_SETFL。 获取当前打开文件的访问标志,设置对应的访问标志,一般常用来设置做非阻塞读写操作。 4.获取、设置记录锁功能,对应的cmd:F_GETLK、F_SETLK、F_SETLKW。 5.获取、设置异步I/O所有权,对应的cmd:F_GETOWN、F_SETOWN。 获取和设置用来接收SIGIO/SIGURG信号的进程id或者进程组id。返回对应的进程id或者进程组id取负值。 *
fd | |
cmd | |
arg |
在文件 fs_syscall.c 第 957 行定义.
在文件 process_syscall.c 第 350 行定义.
int SysFutex | ( | const unsigned int * | uAddr, |
unsigned int | flags, | ||
int | val, | ||
unsigned int | absTime, | ||
const unsigned int * | newUserAddr | ||
) |
SysFutex 操作用户态快速互斥锁 系统调用
absTime | 绝对时间 |
flags | 操作标识(FUTEX_WAKE | FUTEX_WAIT) |
newUserAddr | FUTEX_REQUEUE下调整后带回新的用户空间地址 |
uAddr | 用户态下共享内存的地址,里面存放的是一个对齐的整型计数器 |
val |
在文件 process_syscall.c 第 1022 行定义.
获取当前进程组ID
在文件 process_syscall.c 第 401 行定义.
char * SysGetcwd | ( | char * | buf, |
size_t | n | ||
) |
在文件 fs_syscall.c 第 1706 行定义.
在文件 fs_syscall.c 第 2239 行定义.
在文件 net_syscall.c 第 194 行定义.
在文件 process_syscall.c 第 365 行定义.
获取指定进程的组ID,为0时返回当前进程ID
在文件 process_syscall.c 第 392 行定义.
在文件 process_syscall.c 第 227 行定义.
在文件 misc_syscall.c 第 158 行定义.
在文件 net_syscall.c 第 165 行定义.
在文件 net_syscall.c 第 366 行定义.
char * SysGetThreadArea | ( | void | ) |
int SysInfo | ( | struct sysinfo * | info | ) |
系统信息
在文件 misc_syscall.c 第 71 行定义.
int SysLink | ( | const char * | path1, |
const char * | path2 | ||
) |
在文件 fs_syscall.c 第 611 行定义.
int SysLstat | ( | const char * | path, |
struct kstat * | buffer | ||
) |
在文件 ipc_syscall.c 第 389 行定义.
系统调用|申请虚拟内存(分配线性地址区间)
鸿蒙与Linux标准库的差异 http://weharmonyos.com/zh-cn/device-dev/kernel/%E4%B8%8ELinux%E6%A0%87%E5%87%86%E5%BA%93%E7%9A%84%E5%B7%AE%E5%BC%82/
addr | 用来请求使用某个特定的虚拟内存地址。如果取NULL,结果地址就将自动分配(这是推荐的做法), 否则会降低程序的可移植性,因为不同系统的可用地址范围不一样。 |
size | 内存段的大小。 |
prot | 用于设置内存段的访问权限,有如下权限: PROT_READ:允许读该内存段。 PROT_WRITE:允许写该内存段。 PROT_EXEC:允许执行该内存段。 PROT_NONE:不能访问。 |
flags | 控制程序对内存段的改变所造成的影响,有如下属性: MAP_PRIVATE:标志指定线性区中的页可以被进程独享 MAP_SHARED:标志指定线性区中的页可以被几个进程共享 |
fd | 打开的文件描述符,如果新的线性区将把一个文件映射到内存的情况 |
offset | 用以改变经共享内存段访问的文件中数据的起始偏移值。 |
在文件 vm_syscall.c 第 58 行定义.
int SysMount | ( | const char * | source, |
const char * | target, | ||
const char * | filesystemtype, | ||
unsigned long | mountflags, | ||
const void * | data | ||
) |
SysMount 挂载文件系统 挂载是指将一个存储设备挂接到一个已存在的路径上。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的路径上, 然后通过这个路径来访问存储设备。如果只有一个存储设备,则可以直接挂载到根目录 / 上,变成根文件系统
data | 特定文件系统的私有数据 |
filesystemtype | 挂载的文件系统类型 |
mountflags | 读写标志位 |
source | 已经格式化的块设备名称 |
target | 挂载路径,即挂载点 |
在文件 fs_syscall.c 第 666 行定义.
修改访问权限
addr |
在文件 vm_syscall.c 第 100 行定义.
封装posix的标准接口,获取和设置消息队列的属性
mqd | |
new | 判断是否是获取还是设置功能,new==null 获取 否则为设置 |
old |
在文件 ipc_syscall.c 第 138 行定义.
打开一个消息队列,由posix接口封装
IPC(Inter-Process Communication,进程间通信) 每个进程各自有不同的用户地址空间,进程之间地址保护,相互隔离,任何一个进程的信息在另一个进程中都看不到, 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区, 进程B再从内核缓冲区把数据读走, IPC实现方式之消息队列: 消息队列特点总结: (1)消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识. (2)消息队列允许一个或多个进程向它写入与读取消息. (3)管道和消息队列的通信数据都是先进先出的原则。 (4)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。 (5)消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 (6)目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,System V消息队列是随内核持续的, 只有在内核重起或者人工删除时,该消息队列才会被删除。 鸿蒙liteos 支持POSIX消息队列并加入了一种自研的消息队列 liteipc,此处重点讲 posix消息队列 *
mqName | |
openFlag | |
mode | |
attr |
在文件 ipc_syscall.c 第 87 行定义.
ssize_t SysMqTimedReceive | ( | mqd_t | personal, |
char * | msg, | ||
size_t | msgLen, | ||
unsigned int * | msgPrio, | ||
const struct timespec * | absTimeout | ||
) |
定时接收消息,任务将被阻塞,等待被唤醒读取
在文件 ipc_syscall.c 第 230 行定义.
int SysMqTimedSend | ( | mqd_t | personal, |
const char * | msg, | ||
size_t | msgLen, | ||
unsigned int | msgPrio, | ||
const struct timespec * | absTimeout | ||
) |
定时时间发送消息,任务将被阻塞,等待被唤醒写入消息
在文件 ipc_syscall.c 第 195 行定义.
int SysMqUnlink | ( | const char * | mqName | ) |
从内核中删除名为mqName的消息队列 如果该函数被调用了,但是仍然有进程已经打开了这个消息队列,那么这个消息队列 的销毁会被推迟到所有的引用都被关闭时执行.并且函数 mq_unlink() 不需要阻塞 到所有的引用都被关闭为止,它会立即返回.函数 mq_unlink()调用成功后, 如果在 随后调用 mq_open() 时重用这个消息队列名字,效果就像这个名字的消息队列不存在, 如果没有设置O_CREAT标志,函数mq_open() 会返回失败,否则会创建一个新的消息队列. *
mqName |
在文件 ipc_syscall.c 第 176 行定义.
oldAddr | 需要扩大(或缩小)的内存段的原始地址。注意old_address必须是页对齐。 |
oldLen | 内存段的原始大小。 |
newLen | 新内存段的大小。 |
flags | 如果没有足够的空间在当前位置展开映射,则返回失败 MREMAP_MAYMOVE:允许内核将映射重定位到新的虚拟地址。 MREMAP_FIXED:mremap()接受第五个参数,void *new_address,该参数指定映射地址必须页对齐; |
newAddr | 在new_address和new_size指定的地址范围内的所有先前映射都被解除映射。如果指定了MREMAP_FIXED, 还必须指定MREMAP_MAYMOVE。 |
在文件 vm_syscall.c 第 90 行定义.
int SysNanoSleep | ( | const struct timespec * | rqtp, |
struct timespec * | rmtp | ||
) |
系统调用|打开文件, 正常情况下返回进程的FD值
在文件 fs_syscall.c 第 294 行定义.
管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。 调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用,一个表示读端,一个表示写端。 3. 规定数据从管道的写端流入管道,从读端流出。 管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。 管道的局限性: ① 数据自己读不能自己写。 ② 数据一旦被读走,便不在管道中存在,不可反复读取。 ③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。 ④ 只能在有公共祖先的进程间使用管道。 常见的通信方式有,单工通信、半双工通信、全双工通信。 *
pipefd |
在文件 fs_syscall.c 第 995 行定义.
SysPoll I/O多路转换
fds | fds是一个struct pollfd类型的数组,用于存放需要检测其状态的socket描述符,并且调用poll函数之后fds数组不会被清空; 一个pollfd结构体表示一个被监视的文件描述符,通过传递fds指示 poll() 监视多个文件描述符。 |
nfds | 记录数组fds中描述符的总数量。 |
timeout | 指定等待的毫秒数,无论 I/O 是否准备好,poll() 都会返回,和select函数是类似的。 |
在文件 fs_syscall.c 第 1552 行定义.
int SysPpoll | ( | struct pollfd * | fds, |
nfds_t | nfds, | ||
const struct timespec * | tmo_p, | ||
const sigset_t * | sigmask, | ||
int | nsig | ||
) |
在文件 fs_syscall.c 第 2648 行定义.
对进程进行特定操作
在文件 fs_syscall.c 第 1597 行定义.
在文件 fs_syscall.c 第 2095 行定义.
int SysPselect6 | ( | int | nfds, |
fd_set * | readfds, | ||
fd_set * | writefds, | ||
fd_set * | exceptfds, | ||
const struct timespec * | timeout, | ||
const long | data[2] | ||
) |
在文件 fs_syscall.c 第 2682 行定义.
在文件 fs_syscall.c 第 2134 行定义.
char * SysRealpath | ( | const char * | path, |
char * | resolvedPath | ||
) |
ssize_t SysRecvFrom | ( | int | socket, |
void * | buffer, | ||
size_t | length, | ||
int | flags, | ||
struct sockaddr * | address, | ||
socklen_t * | addressLen | ||
) |
在文件 net_syscall.c 第 298 行定义.
在文件 net_syscall.c 第 444 行定义.
int SysRename | ( | const char * | oldpath, |
const char * | newpath | ||
) |
重命名文件
在文件 fs_syscall.c 第 787 行定义.
int SysRmdir | ( | const char * | pathname | ) |
在文件 process_syscall.c 第 1062 行定义.
在文件 process_syscall.c 第 164 行定义.
在文件 process_syscall.c 第 245 行定义.
在文件 process_syscall.c 第 236 行定义.
在文件 process_syscall.c 第 113 行定义.
在文件 process_syscall.c 第 254 行定义.
在文件 process_syscall.c 第 1108 行定义.
在文件 process_syscall.c 第 218 行定义.
在文件 process_syscall.c 第 140 行定义.
在文件 process_syscall.c 第 105 行定义.
int SysSelect | ( | int | nfds, |
fd_set * | readfds, | ||
fd_set * | writefds, | ||
fd_set * | exceptfds, | ||
struct timeval * | timeout | ||
) |
SysSelect 系统调用|文件系统|select .鸿蒙liteos目前也支持epoll方式
exceptfds | 文件集将监视文件集中的任何文件是否发生错误,可用于其他的用途, 例如,监视带外数据OOB,带外数据使用MSG_OOB标志发送到套接字上。当select函数返回的时候, exceptfds将清除其中的其他文件描述符,只留下标记有OOB数据的文件描述符。 |
nfds | select监视的文件句柄数,一般设为要监视各文件中的最大文件描述符值加1。 |
readfds | 文件描述符集合监视文件集中的任何文件是否有数据可读,当select函数返回的时候, readfds将清除其中不可读的文件描述符,只留下可读的文件描述符。 |
timeout | 参数是一个指向 struct timeval 类型的指针,它可以使 select()在等待 timeout 时间后 若没有文件描述符准备好则返回。其timeval结构用于指定这段时间的秒数和微秒数。它可以使select处于三种状态: (1) 若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止; (2) 若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值; (3) timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。 |
writefds | 文件描述符集合监视文件集中的任何文件是否有数据可写,当select函数返回的时候, writefds将清除其中不可写的文件描述符,只留下可写的文件描述符。 |
在文件 fs_syscall.c 第 1135 行定义.
在文件 net_syscall.c 第 223 行定义.
在文件 net_syscall.c 第 396 行定义.
ssize_t SysSendTo | ( | int | s, |
const void * | dataptr, | ||
size_t | size, | ||
int | flags, | ||
const struct sockaddr * | to, | ||
socklen_t | tolen | ||
) |
在文件 net_syscall.c 第 246 行定义.
在文件 process_syscall.c 第 825 行定义.
在文件 time_syscall.c 第 108 行定义.
为指定进程设置进程组ID
在文件 process_syscall.c 第 370 行定义.
在文件 process_syscall.c 第 713 行定义.
在文件 process_syscall.c 第 677 行定义.
在文件 process_syscall.c 第 530 行定义.
在文件 process_syscall.c 第 565 行定义.
在文件 net_syscall.c 第 348 行定义.
int SysSetThreadArea | ( | const char * | area | ) |
int SysShellExec | ( | const char * | msgName, |
const char * | cmdString | ||
) |
执行 shell 命令
在文件 misc_syscall.c 第 106 行定义.
连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问 一旦创建/引用了一个共享存储段,那么进程就可调用shmat函数将其连接到它的地址空间中 如果shmat成功执行,那么内核将使与该共享存储相关的shmid_ds结构中的shm_nattch计数器值加1
shmid | |
shmaddr | |
shmflg |
在文件 vm_syscall.c 第 152 行定义.
完成对共享内存的控制 此函数可以对shmid指定的共享存储进行多种操作(删除、取信息、加锁、解锁等)
shmid | 共享内存标识符 |
cmd | IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中 IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内 IPC_RMID:删除这片共享内存 |
buf | 共享内存管理结构体。 |
在文件 vm_syscall.c 第 174 行定义.
与shmat函数相反,是用来断开与共享内存附加点的地址,禁止本进程访问此片共享内存
shmaddr | 连接的共享内存的起始地址 本函数调用并不删除所指定的共享内存区,而只是将先前用shmat函数连接(attach)好的共享内存脱离(detach)目前的进程 |
在文件 vm_syscall.c 第 192 行定义.
得到一个共享内存标识符或创建一个共享内存对象
key | 建立新共享内存对象 标识符是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案。 为此,每个IPC对象都与一个键(key)相关联,这个键作为该对象的外部名,无论何时创建IPC结构(通过msgget、semget、shmget创建), 都应给IPC指定一个键, key_t由ftok创建,ftok当然在本工程里找不到,所以要写这么多. |
size | 新建的共享内存大小,以字节为单位 |
shmflg | IPC_CREAT IPC_EXCL IPC_CREAT: 在创建新的IPC时,如果key参数是IPC_PRIVATE或者和当前某种类型的IPC结构无关,则需要指明flag参数的IPC_CREAT标志位, 则用来创建一个新的IPC结构。(如果IPC结构已存在,并且指定了IPC_CREAT,则IPC_CREAT什么都不做,函数也不出错) IPC_EXCL: 此参数一般与IPC_CREAT配合使用来创建一个新的IPC结构。如果创建的IPC结构已存在函数就出错返回, 返回EEXIST(这与open函数指定O_CREAT和O_EXCL标志原理相同) |
在文件 vm_syscall.c 第 129 行定义.
int SysSigAction | ( | int | sig, |
const sigaction_t *restrict | sa, | ||
sigaction_t *restrict | old, | ||
size_t | sigsetsize | ||
) |
注册信号,鸿蒙内核只捕捉了SIGSYS 信号
在文件 ipc_syscall.c 第 274 行定义.
int SysSigPending | ( | sigset_t_l * | setl | ) |
int SysSigprocMask | ( | int | how, |
const sigset_t_l *restrict | setl, | ||
sigset_t_l *restrict | oldl, | ||
size_t | sigsetsize | ||
) |
系统调用之进程信号屏蔽, 什么意思?简单说就是 一个信号来了进程要不要处理,屏蔽就是不处理,注意不能屏蔽SIGKILL和SIGSTOP信号,必须要处理.
how | SIG_BLOCK 加入信号到进程屏蔽。set包含了希望阻塞的附加信号 SIG_UNBLOCK 从进程屏蔽里将信号删除。set包含了希望解除阻塞的信号 SIG_SETMASK 将set的值设定为新的进程屏蔽 |
setl | |
oldl | |
sigsetsize |
在文件 ipc_syscall.c 第 290 行定义.
int SysSigSuspend | ( | sigset_t_l * | setl | ) |
在文件 ipc_syscall.c 第 375 行定义.
int SysSigTimedWait | ( | const sigset_t_l * | setl, |
siginfo_t * | info, | ||
const struct timespec * | timeout, | ||
size_t | sigsetsize | ||
) |
在文件 ipc_syscall.c 第 312 行定义.
int SysStat | ( | const char * | path, |
struct kstat * | buf | ||
) |
int SysStatfs | ( | const char * | path, |
struct statfs * | buf | ||
) |
int SysStatx | ( | int | fd, |
const char *restrict | path, | ||
int | flag, | ||
unsigned | mask, | ||
struct statx *restrict | stx | ||
) |
在文件 fs_syscall.c 第 1432 行定义.
int SysSymlink | ( | const char * | target, |
const char * | linkpath | ||
) |
将内存缓冲区数据写回硬盘
在文件 syscall_lookup.h 第 62 行定义.
在文件 process_syscall.c 第 1005 行定义.
在文件 process_syscall.c 第 976 行定义.
time_t SysTime | ( | time_t * | tloc | ) |
在文件 time_syscall.c 第 160 行定义.
int SysTimerDelete | ( | timer_t | timerID | ) |
int SysTimerGetoverrun | ( | timer_t | timerID | ) |
int SysTimerGettime | ( | timer_t | timerID, |
struct itimerspec * | value | ||
) |
int SysTimerGettime64 | ( | timer_t | timerID, |
struct itimerspec64 * | value | ||
) |
int SysTimerSettime | ( | timer_t | timerID, |
int | flags, | ||
const struct itimerspec * | value, | ||
struct itimerspec * | oldValue | ||
) |
在文件 time_syscall.c 第 212 行定义.
int SysTimerSettime64 | ( | timer_t | timerID, |
int | flags, | ||
const struct itimerspec64 * | value, | ||
struct itimerspec64 * | oldValue | ||
) |
clock_t SysTimes | ( | struct tms * | buf | ) |
int SysTruncate | ( | const char * | path, |
off_t | length | ||
) |
int SysUmount | ( | const char * | target | ) |
卸载文件系统
在文件 fs_syscall.c 第 894 行定义.
int SysUname | ( | struct utsname * | name | ) |
int SysUnlink | ( | const char * | pathname | ) |
删除链:删除由装入点管理的文件
执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1, 如果不是1说明此文件还有其他链接对象,因此只对此文件的连接数进行减1操作。若连接数为1, 并且在此时没有任何进程打开该文件,此内容才会真正地被删除掉。在有进程打开此文件的情况下, 则暂时不会删除,直到所有打开该文件的进程都结束时文件就会被删除。 *
在文件 fs_syscall.c 第 519 行定义.
在文件 process_syscall.c 第 999 行定义.
在文件 process_syscall.c 第 953 行定义.
在文件 process_syscall.c 第 930 行定义.
int SysUtime | ( | const char * | path, |
const struct utimbuf * | ptimes | ||
) |
在文件 time_syscall.c 第 45 行定义.
在文件 process_syscall.c 第 307 行定义.
在文件 process_syscall.c 第 314 行定义.