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

📄 1043.html

📁 著名的linux英雄站点的文档打包
💻 HTML
📖 第 1 页 / 共 4 页
字号:
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-&gt;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 + -