⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fcntl.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "lib.h"#include <unistd.h>#include <errno.h>#include <stdarg.h>#include "sys9.h"/* * BUG: advisory locking not implemented */#define OFL (O_ACCMODE|O_NONBLOCK|O_APPEND)intfcntl(int fd, int cmd, ...){	int arg, i, ans, err;	Fdinfo *fi, *fans;	va_list va;	unsigned long oflags;	err = 0;	ans = 0;	va_start(va, cmd);	arg = va_arg(va, int);	va_end(va);	fi = &_fdinfo[fd];	if(fd<0 || fd>=OPEN_MAX || !(fi->flags&FD_ISOPEN))		err = EBADF;	else switch(cmd){		case F_DUPFD:			if(fi->flags&(FD_BUFFERED|FD_BUFFEREDX)){				err = EGREG;	/* dup of buffered fd not implemented */				break;			}			oflags = fi->oflags;			for(i = (arg>0)? arg : 0; i<OPEN_MAX; i++)				if(!(_fdinfo[i].flags&FD_ISOPEN))					break;			if(i == OPEN_MAX)				err = EMFILE;			else {				ans = _DUP(fd, i);				if(ans != i){					if(ans < 0){						_syserrno();						err = errno;					}else						err = EBADF;				}else{					fans = &_fdinfo[ans];					fans->flags = fi->flags&~FD_CLOEXEC;					fans->oflags = oflags;					fans->uid = fi->uid;					fans->gid = fi->gid;				}			}			break;		case F_GETFD:			ans = fi->flags&FD_CLOEXEC;			break;		case F_SETFD:			fi->flags = (fi->flags&~FD_CLOEXEC)|(arg&FD_CLOEXEC);			break;		case F_GETFL:			ans = fi->oflags&OFL;			break;		case F_SETFL:			fi->oflags = (fi->oflags&~OFL)|(arg&OFL);			break;		case F_GETLK:		case F_SETLK:		case F_SETLKW:			err = EINVAL;			break;		}	if(err){		errno = err;		ans = -1;	}	return ans;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -