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

📄 open.c

📁 APUE(第二版)的随书源代码,与第一版的代码相比增加了一些章节的代码(详见第二版的说明)
💻 C
字号:
#include	"db.h"/* Open or create a database.  Same arguments as open(). */DB *db_open(const char *pathname, int oflag, int mode){	DB			*db;	int			i, len;	char		asciiptr[PTR_SZ + 1],				hash[(NHASH_DEF + 1) * PTR_SZ + 2];					/* +2 for newline and null */	struct stat	statbuff;		/* Allocate a DB structure, and the buffers it needs */	len = strlen(pathname);	if ( (db = _db_alloc(len)) == NULL)		err_dump("_db_alloc error for DB");	db->oflag = oflag;		/* save a copy of the open flags */		/* Open index file */	strcpy(db->name, pathname);	strcat(db->name, ".idx");	if ( (db->idxfd = open(db->name, oflag, mode)) < 0) {		_db_free(db);		return(NULL);	}		/* Open data file */	strcpy(db->name + len, ".dat");	if ( (db->datfd = open(db->name, oflag, mode)) < 0) {		_db_free(db);		return(NULL);	}		/* If the database was created, we have to initialize it */	if ((oflag & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) {			/* Write lock the entire file so that we can stat			   the file, check its size, and initialize it,			   as an atomic operation. */		if (writew_lock(db->idxfd, 0, SEEK_SET, 0) < 0)			err_dump("writew_lock error");		if (fstat(db->idxfd, &statbuff) < 0)			err_sys("fstat error");		if (statbuff.st_size == 0) {				/* We have to build a list of (NHASH_DEF + 1) chain				   ptrs with a value of 0.  The +1 is for the free				   list pointer that precedes the hash table. */			sprintf(asciiptr, "%*d", PTR_SZ, 0);			hash[0] = 0;			for (i = 0; i < (NHASH_DEF + 1); i++)				strcat(hash, asciiptr);			strcat(hash, "\n");			i = strlen(hash);			if (write(db->idxfd, hash, i) != i)				err_dump("write error initializing index file");		}		if (un_lock(db->idxfd, 0, SEEK_SET, 0) < 0)			err_dump("un_lock error");	}	db->nhash   = NHASH_DEF;/* hash table size */	db->hashoff = HASH_OFF;	/* offset in index file of hash table */							/* free list ptr always at FREE_OFF */	db_rewind(db);	return(db);}

⌨️ 快捷键说明

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