#ifndef _UNISTD_H #define _UNISTD_H /* ok, this may be a joke, but I'm working on it */ #define _POSIX_VERSION 198808L #define _POSIX_CHOWN_RESTRICTED /* only root can do a chown (I think..) */ #define _POSIX_NO_TRUNC /* no pathname truncation (but see in kernel) */ #define _POSIX_VDISABLE '\0' /* character to disable things like ^C */ /*#define _POSIX_SAVED_IDS */ /* we'll get to this yet */ /*#define _POSIX_JOB_CONTROL */ /* we aren't there quite yet. Soon hopefully */ #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 #ifndef NULL #define NULL ((void *)0) #endif /* access */ #define F_OK 0 #define X_OK 1 #define W_OK 2 #define R_OK 4 /* lseek */ #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 /* _SC stands for System Configuration. We don't use them much */ #define _SC_ARG_MAX 1 #define _SC_CHILD_MAX 2 #define _SC_CLOCKS_PER_SEC 3 #define _SC_NGROUPS_MAX 4 #define _SC_OPEN_MAX 5 #define _SC_JOB_CONTROL 6 #define _SC_SAVED_IDS 7 #define _SC_VERSION 8 /* more (possibly) configurable things - now pathnames */ #define _PC_LINK_MAX 1 #define _PC_MAX_CANON 2 #define _PC_MAX_INPUT 3 #define _PC_NAME_MAX 4 #define _PC_PATH_MAX 5 #define _PC_PIPE_BUF 6 #define _PC_NO_TRUNC 7 #define _PC_VDISABLE 8 #define _PC_CHOWN_RESTRICTED 9 #include #include #include #include #ifdef __LIBRARY__ #define __NR_setup 0 /* used only by init, to get system going */ #define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3 #define __NR_write 4 #define __NR_open 5 #define __NR_close 6 #define __NR_waitpid 7 #define __NR_creat 8 #define __NR_link 9 #define __NR_unlink 10 #define __NR_execve 11 #define __NR_chdir 12 #define __NR_time 13 #define __NR_mknod 14 #define __NR_chmod 15 #define __NR_chown 16 #define __NR_break 17 #define __NR_stat 18 #define __NR_lseek 19 #define __NR_getpid 20 #define __NR_mount 21 #define __NR_umount 22 #define __NR_setuid 23 #define __NR_getuid 24 #define __NR_stime 25 #define __NR_ptrace 26 #define __NR_alarm 27 #define __NR_fstat 28 #define __NR_pause 29 #define __NR_utime 30 #define __NR_stty 31 #define __NR_gtty 32 #define __NR_access 33 #define __NR_nice 34 #define __NR_ftime 35 #define __NR_sync 36 #define __NR_kill 37 #define __NR_rename 38 #define __NR_mkdir 39 #define __NR_rmdir 40 #define __NR_dup 41 #define __NR_pipe 42 #define __NR_times 43 #define __NR_prof 44 #define __NR_brk 45 #define __NR_setgid 46 #define __NR_getgid 47 #define __NR_signal 48 #define __NR_geteuid 49 #define __NR_getegid 50 #define __NR_acct 51 #define __NR_phys 52 #define __NR_lock 53 #define __NR_ioctl 54 #define __NR_fcntl 55 #define __NR_mpx 56 #define __NR_setpgid 57 #define __NR_ulimit 58 #define __NR_uname 59 #define __NR_umask 60 #define __NR_chroot 61 #define __NR_ustat 62 #define __NR_dup2 63 #define __NR_getppid 64 #define __NR_getpgrp 65 #define __NR_setsid 66 #define __NR_sigaction 67 #define __NR_sgetmask 68 #define __NR_ssetmask 69 #define __NR_setreuid 70 #define __NR_setregid 71 #define __NR_sigsuspend 72 #define __NR_sigpending 73 #define __NR_sethostname 74 #define __NR_setrlimit 75 #define __NR_getrlimit 76 #define __NR_getrusage 77 #define __NR_gettimeofday 78 #define __NR_settimeofday 79 #define __NR_getgroups 80 #define __NR_setgroups 81 #define __NR_select 82 #define __NR_symlink 83 #define __NR_lstat 84 #define __NR_readlink 85 #define __NR_uselib 86 #define __NR_execve2 87 #define __NR_getdents 88 #define __NR_sleep 90 #define __NR_getcwd 91 #define _syscall0(type,name) \ type name(void) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name)); \ if (__res >= 0) \ return (type) __res; \ errno = -__res; \ return -1; \ } #define _syscall1(type,name,atype,a) \ type name(atype a) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(a))); \ if (__res >= 0) \ return (type) __res; \ errno = -__res; \ return -1; \ } #define _syscall2(type,name,atype,a,btype,b) \ type name(atype a,btype b) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(a)),"c" ((long)(b))); \ if (__res >= 0) \ return (type) __res; \ errno = -__res; \ return -1; \ } #define _syscall3(type,name,atype,a,btype,b,ctype,c) \ type name(atype a,btype b,ctype c) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(a)),"c" ((long)(b)),"d" ((long)(c))); \ if (__res>=0) \ return (type) __res; \ errno=-__res; \ return -1; \ } #endif /* __LIBRARY__ */ extern int errno; struct linux_dirent { long d_ino;//inode number off_t d_off;//offset to next dirent unsigned short d_reclen;//该结构体的长度,固定为32个字节 char d_name[];//name }; int access(const char * filename, mode_t mode); int acct(const char * filename); int alarm(int sec); int brk(void * end_data_segment); void * sbrk(ptrdiff_t increment); int chdir(const char * filename); int chmod(const char * filename, mode_t mode); int chown(const char * filename, uid_t owner, gid_t group); int chroot(const char * filename); int close(int fildes); int creat(const char * filename, mode_t mode); int dup(int fildes); int execve(const char * filename, char ** argv, char ** envp); int execv(const char * pathname, char ** argv); int execvp(const char * file, char ** argv); int execl(const char * pathname, char * arg0, ...); int execlp(const char * file, char * arg0, ...); int execle(const char * pathname, char * arg0, ...); volatile void exit(int status); volatile void _exit(int status); int fcntl(int fildes, int cmd, ...); int fork(void); int getpid(void); int getuid(void); int geteuid(void); int getgid(void); int getegid(void); int ioctl(int fildes, int cmd, ...); int kill(pid_t pid, int signal); int link(const char * filename1, const char * filename2); int lseek(int fildes, off_t offset, int origin); int mknod(const char * filename, mode_t mode, dev_t dev); int mount(const char * specialfile, const char * dir, int rwflag); int nice(int val); int open(const char * filename, int flag, ...); int pause(void); int pipe(int * fildes); int read(int fildes, char * buf, off_t count); int setpgrp(void); int setpgid(pid_t pid,pid_t pgid); int setuid(uid_t uid); int setgid(gid_t gid); void (*signal(int sig, void (*fn)(int)))(int); int stat(const char * filename, struct stat * stat_buf); int fstat(int fildes, struct stat * stat_buf); int stime(time_t * tptr); int sync(void); time_t time(time_t * tloc); time_t times(struct tms * tbuf); int ulimit(int cmd, long limit); mode_t umask(mode_t mask); int umount(const char * specialfile); int uname(struct utsname * name); int unlink(const char * filename); int ustat(dev_t dev, struct ustat * ubuf); int utime(const char * filename, struct utimbuf * times); pid_t waitpid(pid_t pid,int * wait_stat,int options); pid_t wait(int * wait_stat); int write(int fildes, const char * buf, off_t count); int dup2(int oldfd, int newfd); int getppid(void); pid_t getpgrp(void); pid_t setsid(void); int execve2(const char *path, char ** argv, char ** envp); int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned long count); int sleep(unsigned int seconds); long getcwd(char * buf, size_t size); #define __always_inline inline __attribute__((always_inline)) #endif