linux011-unstd.h头文件

时间:2022-07-20 01:09:04
#ifndef _UNISTD_H
#define _UNISTD_H
//指出符合IEEE标志1003.1实现的版本
#define _POSIX_VERSION 19808L
//chown和fchown的使用受限于进程的权限
#define _POSIX_CHOWN_RESTRICTRD
//长于(name max)的路径名将产生错误,不会自动截断
#define _POSIX_NO_TRUNC
//这个符号定义成字符值,该值将禁止终端对其的处理
#define _POSIX_VDISABLE '\0'

#define STDIN_FILEN0  0 //标准输入文件句柄 
#define STDOUT_DILENO 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 //将文件读写指针设置位文件长度加上偏移值

#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 // 版本
			     // 
#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<sys/stat.h> 
#include<sys/times.h> 
#include<sys/utsname.h> 
#include<utime.h> 

#ifdef _LIBRARY_

#define _NR_setup    0
#define _NR_fork     1
#define _NR_exit     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_chwon    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

/*定义系统调用嵌入式汇编宏函数
*不带参数的系统调用宏函数 type name(void)
*%0-eax(res),%1-eax(_NR_##name).其中name是系统调用的名称,与上面_NR_组合形成上面的
*系统调用符号常数,从而用来对系统调用表中函数指针寻址
*返回:如果返回值大于等于0,则返回该值,否则置出错号errno,并返回-1
*/

#define _syscall0(type,name) \
	type name(void)      \
	{                    \
	  long _res;	     \
__asm__ volatile("int 0x80"  \
		 :"=a(_res)" \
                 :""(_NR_##name);\ //输入系统中断调用号_NR_name
                 );          \
if(_res>=0)		     \
	return (type) _res;  \
errno=-_res;		     \
return -1;		     \
        }


/*有一个参数的系统调用函数type name(atype a)
*%0-eax(_res),%1-eax(_NR_name),%2-ebx(a)
*
*
*/
#define _syscall1(type,name,atype,a)           \    
type name(atype a)                             \	
{					       \	
	long _res;			       \	
	_asm_ volaile(			       \	
		"int 0x80"		       \	
		:"=a"(_res)		       \	
		:""(_NR_##name),"b"((long)(a)) \	
		);			       \	
	if(_res>0)			       \	
		return (type) _res;	       \	
	errno = -_res;			       \	
	return -1;
}

/*有两个参数的系统调用type name(atype a,btype b)
*%0-eax(res),%1-eax(_NR_name),%2-ebx(a),%3-ecx(b)
*
*/
#define _syscall2(type,name,atype a,btype b)               \ 
type name(atype a,btype b)				   \ 
{							   \ 
	long _res;					   \ 
	_asm_ volaile(					   \ 
		"int 0x80"				   \ 
		:"=a"(_res)				   \ 
		:""(_NR_name),"b"((long)(a)),"c"((long)(b))\ 
		);					   \ 
	if(_res>=0)					   \ 
		return (type) _res;			   \ 
	errno =-_res;					   \ 
	return -1;                                         \
}

/*有2个参数的系统调用宏函数type name(atype a,btype b,ctype c)
*%0-eax(res),%1-eax(_NR_name),%2-ebx(a),%3-ecx(b),%4-edx(c)
*
*/
#define _syscall3(type,name,atype a,btype b,ctypec) \
type name(atype a,btype b,ctype c)		    \
{						    \
	long _res;				    \
	_asm_ volaile(				    \
		"int 0x80"			    \
		:"=a"(_res)			    \
		:""(_NR_name),"b"((long)(a)),	    \
		"c"((long)(b)),"d"((long)(c))	    \
		);				    \
	if(_res>=0)				    \
		return (type)_res;		    \
	errno=-_res;				    \
	return -1;				    \
}


#endif

extern int errno;   //出错号,全局变量

//系统调用的函数原型定义
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*filenem);
int chmod(const char*filenem,mode_t mode);
int chown(const char*filenem,uid_t owner,gid_t group);
int chroot(const char*filenem);
int close(int fildes);
int creat(const char*filenem,mode_t mode);
int dup(int fildes);
int execve(const char*filenamem,char**argv,char**envp);
int ececv(const char*filename,char**argv);
int execvp(const char*file,char**arg);
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*filenamel,const char*filename2);
int lseek(int fildes,off_t offsets,int origin);
int mknod(const char*filename,mode_t mode,dev_t dev);
int mount(const char*specialfile,const char*dir,int reflag);
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 setuid(uid_t uid);
int setpgid(pid_t pid,pid_t pgid);
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*buf);
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,int options);
pit_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);

#endif