📄 1043.html
字号:
fchdir根据已开启的fd(file descriptor)目录来变更。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
int chroot(const char * path); <br>
chroot改变该程式的根目录所在。例如chroot("/home/ftp")会将根目录换到/home/ftp下,而所有档案操作都不会超出这个围内。为保障安全性,当chdir("/..")时,将会仅切换到chdir("/"),如此便不会有档案安全问题。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
mkdir/rmdir : 造/移除目录 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
#include <br>
int mkdir(const char * dirname,mode_t mode); <br>
mkdir会造一个新目录出来,例如mkdir("/home/foxman",0755);。 <br>
如果该目录或档案已经存在,则操作失败。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
int rmdir(char * pathname); <br>
这个函数移除pathname目录。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
opendir/readdir/closedir/rewinddir : 读取目录资讯 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
DIR * opendir(const char * pathname); <br>
int closedir(DIR *dir); <br>
struct dirent * readdir(DIR *dir); <br>
int rewinddir(DIR *dir); <br>
struct dirent { <br>
long d_ino; /* inode number */ <br>
off_t d_off; /* offset to this dirent */ <br>
unsigned short d_reclen; /* length of this d_name */ <br>
char d_name [NAME_MAX+1]; /* file name (null-terminated) */ <br>
}; <br>
opendir开启一个目录操作DIR,closedir关闭之。 <br>
readdir则循序读取目录中的资讯,rewinddir则可重新读取目录资讯。 <br>
<br>
以下是个标准例。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
#include <br>
char ** dirGetInfo(const char *pathname) <br>
{ <br>
char ** filenames; <br>
DIR * dir; <br>
struct dirent * ent; <br>
int n = 0; <br>
<br>
filenames = (char **)malloc(sizeof(char*)); <br>
filenames[0]=NULL; <br>
<br>
dir = opendir(pathname); <br>
if (!dir) return filenames; <br>
<br>
while ((ent = readdir(dir))) { <br>
filenames = (char**)realloc(filenames,sizeof(char*)*(n+1)); <br>
filenames[n] = strdup(ent->d_name); <br>
n++; <br>
} <br>
<br>
closedir(dir); <br>
<br>
filenames = (char **)realloc(filenames,sizeof(char*)*(n+1)); <br>
filenames[n] = NULL; <br>
<br>
return filenames; <br>
} <br>
<br>
<br>
Linux程式设计-13.记忆体对映mmap <br>
http://www.openchess.org/noitatsko/programming/ (2001-05-26 11:00:00) <br>
Linux允许将档案对映到记忆体空间中。如此可以产生一个在档案资料及记忆体资料一对一的对映,例如字型档的存取。使用记忆体对映有许多好处: <br>
高速档案存取。一般的I/O机制通常需要将资料先到缓区中。记忆体对映免去了中间这一层,加速档案存取速度。 <br>
可执行档可对映到记忆体空间中,使程式动态载入。Linux Dynamic Loading便是如此实作出来的。 <br>
新的记忆体可以透过利用/dev/zero来产生全零的档案。 <br>
新的记忆体可以用於执行目的,这对解译式编译器非常有用。 <br>
可把档案当成记忆体来用,直接使用指标来操作。 <br>
对映的记忆体可当成行程间共享记忆体,该记忆体内容存在档案中,因此与行程无关。 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
页对齐「Page Alignment」 <br>
#include <br>
size_t getpagesize(void); <br>
<br>
系统记忆体通常被分割成页的单位。在Intel及SPARC上,每页为4096 Bytes(4K),在Alpha上则为8192 Bytes(8K)。getpagesize返回该系统的页大小。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
#include <br>
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset); <br>
int munmap(void *start, size_t length); <br>
<br>
mmap开启记忆体对映。 <br>
<br>
start指定记忆体位置,通常都是用NULL。offset指定档案要在那里开始对映,通常都是用0。 <br>
<br>
protections <br>
<br>
PROT_READ <br>
PROT_WRITE <br>
PROT_EXEC <br>
PROT_NONE <br>
<br>
flags <br>
MAP_FIXED <br>
MAP_PRIVATE <br>
MAP_SHARED <br>
<br>
MAP_ANONYMOUS <br>
MAP_DENYWRITE <br>
MAP_GROWSDOWN <br>
MAP_LOCKED <br>
<br>
munmap关闭记忆体对映。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
int msync(const void *start, size_t length, int flags); <br>
如果开启记忆体对映是希望写入档案中,那麽修改过的记忆体会在一段时间内与档案稍稍有点不同。如果您希望立即将资料写入档案中,可使用msync。 <br>
<br>
start为记忆体开始位置,length为长度。 <br>
<br>
flags则有三个: <br>
MS_ASYNC : 请Kernel快将资料写入。 <br>
MS_SYNC : 在msync结束返回前,将资料写入。 <br>
MS_INVALIDATE : 让核心自行决定是否写入,仅在特殊状况下使用。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
int mlock(const void *addr, size_t len); <br>
int munlock(const void *addr, size_t len); <br>
锁住记忆体,仅root有权限这样做。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
int mlockall(int flags); <br>
锁住所有记忆体空间。 <br>
MCL_CURRENT : 所有的记忆页都会被锁住。 <br>
MCL_FUTURE : 所有的新增的记忆页都会被锁住。 <br>
<br>
int munlockall(void); <br>
<br>
<br>
Linux程式设计-14.动态函数库 <br>
http://www.openchess.org/noitatsko/programming/ (2001-05-26 12:10:00) <br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
本节说明Linux下动态函数库的使用及设计。 <br>
大多数大型的UNIX软体都会将许多个别的部份拆开来设计,通常这些部份被称为「plugins」或「modules」。它们会用许多方式来结合,如「pipe」、「IPC」或「shared objects」。 <br>
<br>
Linux下的Dynamic Linking Loader介面标准来自於Solaris。 <br>
<br>
在Dynamic Linking的操作方式下,所有的函数及资料变数都被称为「symbol」,要使用时,需要透过dlsym来找出其实际位址。 <br>
<br>
<br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
所有动态函数载入的函数均宣告在中,共有四个函数。 <br>
void *dlopen (const char *filename, int flag); <br>
const char *dlerror(void); <br>
void *dlsym(void *handle, char *symbol); <br>
int dlclose (void *handle); <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
dlopen()的作用为寻找函数库档案,开启它、并做一些初始化的动作。 <br>
filename如果以"/"符号开始,dlopen()将不会搜寻该函数库的路径,否则它将会透过以下方式搜寻档案: <br>
<br>
透过LD_LIBRARY_PATH所指定的路径搜寻 <br>
/etc/ld.so.cache所指定的路径。该档案是由ldconfig所产生,其设定位於/etc/ld.so.conf。 <br>
找寻/usr/lib及/lib两个内定目录。 <br>
flag有三个: <br>
RTLD_GLOBAL : 在函数库中的变数内定是不输出的。指定RTLD_GLOBAL可输出这些变数。 <br>
RTLD_LAZY : 当函数被执行时,才找出所使用的变数对照表。 <br>
RTLD_NOW : 当函数被载入时,立刻找出所使用的变数对照表。 <br>
RTLD_GLOBAL可与RTLD_LAZY或RTLD_NOW结合,RTLD_LAZY及RTLD_NOW不可同时使用。 <br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
dlerror()返回最近发生的错误讯息,如果没有错误发生,那麽将会返回NULL。 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
dlsym()载入所指定的函数。 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
dlclose()关闭开启的函数库。它会检查一个对照计数,将开启的函数库次数数量减一,如果为零,则关闭该函数库。 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
hellodl <br>
<br>
<br>
<br>
<br>
<br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
hello.so的设计 <br>
<br>
<br>
<br>
<br>
<br>
Linux程式设计-15.同步I/O多重处理 <br>
http://www.openchess.org/noitatsko/programming/ (2001-05-26 13:04:00) <br>
同步I/O多重处理(Synchronous I/O Multiplexing) <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
当我们在同时间需要处理许多I/O时,例如网路伺服器socket,有时候一个一个处理,程式非常难写,这时候可以利用select来达成。 <br>
<br>
-------------------------------------------------------------------------------- <br>
<br>
#include <br>
#include <br>
#include <br>
int select(int n, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); <br>
<br>
FD_CLR(int fd, fd_set *set); <br>
FD_ISSET(int fd, fd_set *set); <br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -