我喜欢涂鸦的风格,它让我觉得随意也是一种美。大家随意.....

Linux编程常用的函数

上一篇 / 下一篇  2007-12-15 18:04:49 / 个人分类:Linux

Q"Or"\}.PQ | K0呵呵~ 为了方便自己学习转载了http://sunwill.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-138202-uid-34371.html上的文章IXPUB技术博客,`+S[Q*]-ec

W(K`z5P"B6y~0总共分为12部分分别是:进程、线程、消息队列、信号量集、共享内存、PGSQL编程、MYSQL编程、网络编程、文件访问、标准I/O、系统数据文件和信息、信号IXPUB技术博客 WU BaeD
          (一)     进程IXPUB技术博客S5@qj2Abk/yN
1.     进程ID为0的进程通常是调度进程,常常被称为交换进程IXPUB技术博客#[u5L(p pC~Ah R
进程ID为1的进程通常是init进程,在自举过程结束时由内核调用IXPUB技术博客[ c"ER)`6@v}h[
进程ID为2的进程页守护进程,负责支持虚拟存储系统的分页操作
+pe WQ(b\~02.     pid_t getpid( void ); 返回值:调用进程的进程ID     #include <unistd.h>IXPUB技术博客G3JE y z-m
3.     pid_t getppid( void ); 返回值:调用进程的父进程ID  
m#E aq/m:Os04.     uid_t getuid( void ); 返回值:调用进程的实际用户IDIXPUB技术博客:d(z;@|3nn!f4F
5.     uid_t geteuid( void ); 返回值:调用进程的有效用户ID
a)W#GN-r?$x06.     gid_t getgid( void ); 返回值:调用进程的实际组ID
UF t*a'@ ^&e07.     gid_t getegid( void ); 返回值:调用进程的有效组IDIXPUB技术博客-DQ ]R2[&Qk
8.     pid_t fork( void );创建子进程,返回值:子进程返回0,父进程返回子进程ID,出错-1IXPUB技术博客T@H1BE7w w]G*f
9.     #include<sys/wait.h> pid_t wait(int *statloc);//statloc 保存进程终止状态的指针IXPUB技术博客w0qW kp5}9k$U]
10.     #include<sys/wait.h>pid_t waitpid(pid_t pid,int *statloc,int options);IXPUB技术博客 ctx,ZC$M
pid ==-1 等待任一子进程
4^K*GB c xgrD"W0pid >0 等待其子进程ID与pid相等的子进程
"p-f2lt"pw2s6^0pid == 0 等待其组ID等于调用进程组ID的任一子进程IXPUB技术博客/ZHWO]2pG6tC{
pid <-1 等待其组ID等于pid绝对值的任一子进程IXPUB技术博客 s/lCt9nn
options:
$y(e R.z5DO1w0WCONTINUED 若实现支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态尚未报告,则返回其状态IXPUB技术博客 u6cG {9Dywj
WNOHANG 若由pid指定的子进程并不是立即可用的,则waitpid阻塞,此时其返回0IXPUB技术博客QXb,I BJ
WUNTRACED 若实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,并且其状态自暂停以来还未报告过,则返回其状态
7V/^bxk;b R011.#include<unistd.h> int setuid(uid_t uid); 设置实际实际用户ID和有效用户ID;
7W;i]'J QQ#o#Td)GW9]0int setgid(gid_t gid); 设置实际组ID和有效组ID;成功返回0,错误-1IXPUB技术博客'{2aiE#N9h#S
12.#include<stdlib.h>int system(const char *cmdstring)
-m$O$@p/\\3l1`rJAj0system返回值如下            
1ZDUM4KBJ0-1出现错误  
{%A$V-m5uP9I6I9jEj)a0    0调用成功但是没有出现子进程  
)`$pSa(_Jc0    >0   成功退出的子进程的idIXPUB技术博客 eOw4Slcs9F
            (二)线程IXPUB技术博客a9PO4g$Y*Y+gox
1. #include<thread.h> int pthread_equal(pthread_t tid1, pthread_t tid2);
R"h9M3K8F Q!] L{9c0//相等返回非0,否则返回0IXPUB技术博客p#W*y}$K*k
2. pthread_t pthread_self(void);返回调用线程的IDIXPUB技术博客dcP?lM
3. int pthread_create(pthread_t *restrict tidp,
a.y2ti/n*uj0  const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg) ;IXPUB技术博客5Q*{fCn&b;tW r
创建线程:成功返回0,否则返回错误编号
_ fIjT"r|k5P04. void pthread_exit(void *rval_ptr);//终止线程IXPUB技术博客g t[[5|.U)~
5. int pthread_join(pthread_t thread, void **rval_ptr);IXPUB技术博客"N-IMt qU5C#T)A
//自动线程置于分离状态,以恢复资源。成功返回0,否则返回错误编号
%DX#_V1w;]q F&Lu06. int pthread_cancel(pthread_t tid);
iE4a AsLm^)|Ai0//请求取消同一进程中的其他线程;成功返回0,否则返回错误编号IXPUB技术博客iM Ag-q"R
7. void pthread_cleanup_push(void (*rtn)(void *), void *arg);IXPUB技术博客}6}*Km ^ u
    //建立线程清理处理程序
'W'jQo^08. void pthread_cleanup_pop(int execute);//调用建立的清理处理程序IXPUB技术博客6L9@!NV B[{ D
9. int pthread_detach(pthread_t tid);//使线程进入分离状态,已分离也不出错IXPUB技术博客l A3y+X2^P3f
10.int pthread_mutex_init(pthread_mutex_t *restrict mutex,IXPUB技术博客K M,l |l(M)|
  const pthread_nutexattr_t *restrict attr)//初始化互斥量;成功0,失败返回错误编号IXPUB技术博客1C9K%hcm0l
11.int pthread_mutex_destroy(pthread_mutex_t *mutex);
4{&K'?zm0//若有调用malloc动态分配内存则用该函数释放;成功0,失败返回错误编号
EstM:@$}B NB!u p012.int pthread_mutex_lock(pthread_mutex_t *mutex);//锁住互斥量
"Su`,}(cms0  int pthread_mutex_trylock(pthread_mutex_t *mutex);//尝试上锁IXPUB技术博客_8H.rMhpT
  int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁IXPUB技术博客5}7@ KoX_"B
  成功返回0,否则返回错误编号IXPUB技术博客eX,r&}/k|U ?i
13.int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr)//初始化读写锁IXPUB技术博客4Fz7D#sC#l_ N
  int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);//释放资源,在释放内存之前使用
#n:v,Md8EY4RL0b0成功返回0,否则返回错误编号IXPUB技术博客D3j'e huu-|w
14.int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//在读模式下锁定读写锁
+wA ~ ~(kG"]x0  int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//在写模式下锁定读写锁
T$^oL/TE+F5aV0  int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);//锁住读写锁
Y#R#STbM(X015.int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);//尝试在读模式下锁定读写锁IXPUB技术博客%Z*A(Vsh@;~1u)K4w
  int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);//尝试在写模式下锁定读写锁IXPUB技术博客 pY:[r;h'YE C
成功返回0,否则返回错误编号IXPUB技术博客p K~"_/m tQJ'I
16.int pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t * restrict attr)IXPUB技术博客S"F0~|1l*P wg
//初始化条件变量
#J.J F6~4? N7~A0  int pthread_cond_destroy(pthread_cond_t *cond);//去除初始化条件变量
.A B7@V r/R"r%A0成功返回0,否则返回错误编号IXPUB技术博客 I'nD-p$rD!w
17.int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
c9kr,Y R4G-_[0  int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex,IXPUB技术博客rI1TmHfN_ ~e3j
  const struct timespec *restrict timeout);IXPUB技术博客L3i;Kb)Z;D5uu_^+E
  //等待条件变为真,如果在给定的时间内条件不能满足,那么会生成一个代表出错码的返回变量 ;成功返回0,错误返回错误编号
~eDs+Oh a018.int pthread_cond_signal(pthread_cond_t *cond);//唤醒等待该条件的某个线程
CH]#o!r_3i(k^{0  int pthread_cond_broadcast(pthread_cond_t *cond)//唤醒等待该条件的所有线程IXPUB技术博客 ^ XO(b@t1h
19.int pthread_attr_init(pthread_attr_t *attr);//初始化线程属性
B ?7B{J*G3Q/r0  int pthread_attr_destroy(pthread_attr_t *attr);//释放内存空间(动态分配时调用)IXPUB技术博客 D5O-Hi+WO Y)I$qIP
成功返回0,否则返回错误编号
2[#@ nv+WA020.int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr, int *detachstate);IXPUB技术博客 uRW*`.C&^)N#W5J
//获取线程的分离状态IXPUB技术博客$Xc/N7S4Lro
  int pthread_attr_setdetachstate(const pthread_attr_t *restrict attr, int detachstate);
(T.~U%I tT0  //设置分离状态 PTHREAD_CREATE_DETACHED:以分离状态启动线程IXPUB技术博客1wgCh'YU_ R.@
  PTHREAD_CREATE_JOINABLE:正常启动线程,应用程序可以获取线程的终止状态
7g/@W:?(p7CO?*fn0    成功返回0,否则返回错误编号IXPUB技术博客 B['Jk vF
21.int pthread_attr_getstack(const pthread_attr_t *restrict attr,void **restrict stackaddr, size_t *restrict stacksize);//获取线程的栈位置IXPUB技术博客8p%E$x _z&\$e
int pthread_attr_setstack(const pthread_attr_t *attr, void *stackaddr, size_t *stacksize)IXPUB技术博客2E[vx9H:~v9e ^-R-sH
//设置新建线程的栈位置 ;成功返回0,否则返回错误编号
4H)mto,w0|N3T0              (三)消息队列IXPUB技术博客M&}Y/E-T0|
1.每个队列都有一个msqid_ds结构与之相关联:IXPUB技术博客6G6TO9H*L*N%M3y
    struct msqid_ds{
;[.C9i2^k0      struct ipc_perm msg_perm;
5b q?5r.]Q0          msgqnum_t msg_qnum; //消息的数量
"HK.Du` B#z0      msglen_t msg_qbytes; //最大消息的长度
9L6XYZ.A)F-L!Q jdQ1W0      pid_t msg_lspid;   //最后一个发送到消息队列的进程ID
|1\ mn.NWZ N0      pid_t msg_lrpid;   //最后一个读取消息的进程ID
K6Nc(u!E5T:I%sc0      time_t msg_stime;   //最后一次发送到消息队列的时间
9n6Jc?)^Y0      time_t msg_rtime;   //最后一次读取消息的时间
aiia~$]%d;w*V N%zD0      time_t msg_ctime; //最后一次改变的时间
r X1I)H5l6@s0      。
-| Qd/\CC2c]0      。IXPUB技术博客 a5`/d6\,Gg
      。IXPUB技术博客Ut nJ Bl[A5p
  };IXPUB技术博客(i[5@3k@s
  struct ipc_perm{IXPUB技术博客7A!Ma kz5r
      uid_t uid;//拥有者有效的用户ID
:c Zz$}y0      gid_t gid;//拥有者有效的组ID
E$IbR v,P7l}0      uid_t cuid;//创建者有效的用户IDIXPUB技术博客S |+T3CLxGd'R
      uid_t cgid;//创建者有效的组ID
,KEs:gNQ+](@0      mode_t mode; //权限IXPUB技术博客8z7E gxa@ `Y'a
      。
c yR7O&ri-y0      。IXPUB技术博客o1\um3U}1@ o
  }IXPUB技术博客!SUzBYf(\/d:s"T
2.#include <sys/msg.h> int msgget(key_t key, int flag);
d)f qWa0\ tK S0//打开一个现存的队列或创建一个新队列;成功返回0,出错返回-1IXPUB技术博客$j*w~v+ex Y'C
3.int msgctl(int msqid, int cmd, struct msqid_ds *buf);//对消息队列执行多种操作IXPUB技术博客+]+j-@7c#q!tR:u
cmd 可选:IXPUB技术博客:NHeG}[` a
IPC_STAT 取此消息队列的msqid_ds结构,并将它放在buf指向的结构IXPUB技术博客 ~*U~ `"sr?
  IPC_SET:按由buf指向结构中的值,设置与此队列相关结构中的下列四个字段:msg_perm.uid,msg_perm.gid,msg_perm.mode和msg_qbytes.此命令只有下列两种进程才能执行(1)其有效用户ID等于msg_perm.cuid或msg_perm.uid;(2)具有超级用户特权的进程IXPUB技术博客ZcNl4|Q:^i^
  IPC_RMID:从系统中删除消息队列以及仍在该队列中的所有数据。IXPUB技术博客3IC9i~?4E9H}
成功返回0,失败返回-1
QMe3l\6P7Y"D04.int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag)//发送消息到消息队列中IXPUB技术博客K3W c]}3U*?
成功返回0, 不成功返回-1并设置errno,错误码:IXPUB技术博客VsC[$_
EACCES   对调用程序来说,调用被否定IXPUB技术博客yW.r;bT-rZnr
EAGAIN   操作会阻塞进程,但(msgflg & IPC_NOWAIT) != 0
upShd,a K~sAf b)[0EIDRM     msqid已经从系统中删除了IXPUB技术博客@ADj#ENO"L2ZTg9s
EINTR     函数被信号中断IXPUB技术博客OtmW;O*hX2X#c2K
EINVAL     参数msqid无效,消息类型<1,或者msgsz越界了
$K}%mOZck0flag可以指定为IPC_NOWAIT 则不会阻塞直接返回EAGAINIXPUB技术博客P+m+i/u#qb
注:参数msgp指向用户定义的缓冲区,他是如下的结构
B*u6IPl2\!ojf0struct mymsgIXPUB技术博客(K(uj1h#M;g
{IXPUB技术博客c/UiR@'a
long mtypes;     消息类型
8a3F ^/`%i~0char *mtext;   消息文本
el!~ q[AQ0}mymsg_t
.n _"^u XE05.ssize_t msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag);//读取消息
K{.d2v0K.@.Mv0成功则返回消息的数据部分的长度,出错则返回-1IXPUB技术博客v/IQ0dZ]
type: type==0返回队列中的第一个消息
`-{;a Z^2?;BK0  type>0 返回队列中消息类型为type的第一个消息IXPUB技术博客:AL2_#c Cm
  type<0返回队列中消息类型值小于或等于type绝对值的消息(多个取类型值最小的)
Gt6O.T7TSFA-h8Z0        (四) 信号量IXPUB技术博客aO9w)U K*I'c+a7e]
1. 内核为每个信号量集合设置了一个semid_ds结构:
j(o*\8y1E R a/X9d0  struct demid_ds{IXPUB技术博客s#|&w8Cwdi7X
    struct ipc_perm sem_perm;
GtdC V8O#P0    unsigned short sem_nsems; //信号量的个数IXPUB技术博客e;?p? p-Hh$M
    time_t sem_otime; //上一次semop的时间
*N`egx1L V3f\0    time_t sem_ctime;//上一次change的时间
U#RnM-d3{0    。
5F$T9U"V*vg[GE*j0    。
gsJoX3R)`R4C'o0 };
{l l3o[ @02#include<sys/sem.h>. int semget(key_t key, int nsems, int flag);//创建信号量
^b%ZW,GK2Jh}0hV0成功返回一个对应于信号量集标识符的非负整数,不成功返回-1并设置errno,错误码:
h`%G h;BK}2R7O0EACCES   存在key的信号量,但没有授予权限IXPUB技术博客*OT G%iF tacQG
EEXIST   存在key的信号量,但是
TCI0TU5ze@4^HV0    ( (semflg & IPC_CREATE) && (semflg & IPC_EXCL) ) != 0
:^W6i Z!g0EINVAL   nsems <= 0或者大于系统的限制,或者nsems与信号量集的大小不符
/a fA7tU1S!B'i"h0ENOENT   不存在key的信号量,而且(semflg & IPC_CTEATE) == 0IXPUB技术博客M9S_){W#M8TW
ENOSPC   要超出系统范围内对信号量的限制了
f2u nO|9W};Zp9n0功能:
)MG&zup0函数返回与参数key相关的信号量集标识符。
7fjt,H)M6wz0如果键值为IPC_PRIVATE,或者semflg&IPC_CREAT非零且没有信号量集或标识符关联于key,那么函数就创建标识符及与之相关的信号量集。
HQT uT0参数nsems指定了集合中信号量元素的个数,可用0到nsems-1的整数来引用信号量集合中的单个信号量元素。IXPUB技术博客6d \RF!g'e9@
参数semflg指定信号量集的优先级,权限的设置与文件权限设置相同,并可以通过semclt来修改权限值,在使用信号量元素之前,应该用semctl对其进行初始化。IXPUB技术博客:{6BP4c1W yG'x3C9^g
注意:
4g%d4A6_+e'e0函数如果试图创建一个已经存在的信号量集,如果semflg值中包含了IPC_CREAT和IPC_EXCL,则失败并设置errno为EEXIST;否则返回一个已经存在的信号量集的句柄。
C(d e5BVNb,C03.int semctl(int semid, int semnum, int cmd, …);//信号量控制
8B:uy(h!I&l'X0如果成功返回一个非负的值,具体返回值取决于cmd的值。IXPUB技术博客w"{@-wV
cmd值GETVAL、GETPID、GETNCNT和GETZCNT使semctl返回与cmd相关的值。IXPUB技术博客&Q0QV-z:pm[b {
如果成功,所有其它的cmd返回0。IXPUB技术博客z/[(_$HvZ"Cm
如果不成功semctl返回-1并设置errno,必须检测的错误码:IXPUB技术博客^T#BS.}Y
EACCES   对调用程序来说,操作被否定IXPUB技术博客0x6i{$XmY
EINVAL   semid的值或cmd的值无效,或者semnum的值为负或者太大IXPUB技术博客s?[*h0r,kI
EPERM   cmd的值为IPC_RMID或IPC_SET,且调用程序没有所要求的特权
g+Z-p(G+u#h8p9uk;s0ERANGE cmd为SETVAL或SETALL,而且要设置的值越界了IXPUB技术博客 S,UxUIX
功能:IXPUB技术博客}C:N"a"|w
函数semctl为信号量集semid的semnum个元素提供了控制操作。参数cmd指定了操作类型,第四个参数arg可选,是否使用取决于cmd的值。IXPUB技术博客/ne s+YHA
cmd的值:
'`J d9j3j)ODh0GETALL   在arg.array中返回信号量集的值
1| v7_O qi0GETVAL   返回一个特定信号量元素的值IXPUB技术博客Cs0[)t+R(L"l3QF%I}
GETPID   返回最后一个操纵元素的进程的进程ID
&n E D%d0BO0GETNCNT   返回等待元素增加的进程的个数
#^6N \;G'LR)^X0GETZCNT   返回等待元素变成零的进程的个数
_ N:s JZ9?P0IPC_RMID   删除semid标识的信号量集
*`7k6ah9]0P G&J5E7v0IPC_SET   设置来之arg.buf的信号量集的权限IXPUB技术博客 `G^4WPBF,E
IPC_STAT   将信号量集semid的semid_ds结构成员拷贝到arg.buf中
-[$RX-X$` ky0SETALL   用arg.array来设置信号量集的值
Ng!C v8mj c w0SETVAL   将一个特定的信号量元素的值设定为arg.val
7`.Dtc3W nV^0其中有几个命令需要一个arg参数来读取或存储结构
%? a H3}?;d)PnGo C0参数arg的类型为union semun,必须要定义这个类型的数据:
O`+^\2dI.y0union semum
_N @\Rn0{
/E]@d!}%}hX0int       valIXPUB技术博客I al0q5|!V'c
struct semid_ds   *buf;
8R/e(}UBpj0unsigned short   *array;
y/sL0UVt0}arg;IXPUB技术博客R_I%D9R+f(G
4. int semop(int semid, struct sembuf *sops, size_t nsops);//信号量的操作
/A4?O I.A\@.];G)m7K6n0成功返回0,不成功返回-1并设置errno,必须检测的错误码:
)A4AM6j:SVO^0E2BIG   nsops的值太大IXPUB技术博客aU6t\n9Peh
EACCES 对调用程序来说,操作被否定
]kxO`\1byw0EAGAIN 操作会阻塞进程但是(sem_flg&IPC_NOWAIT)!= 0IXPUB技术博客 RbK+E D\JiD
EFBIG   某一个sops条目的sem_num值小于0,或大于信号量集中元素的数目
8i.L Uw9DEK0EIDRM   信号量集标识符semid已经从系统中删除了
y0jdF q7l0EINTR   semop被信号中断
/o9V1ps!xV o0EINVAL   semid的值无效,或者请求做SEM_UNDO操作的独立信号量集的数量IXPUB技术博客;C#O[3CBd xWc
超出了限制IXPUB技术博客l e#m&~m^9@
ENOSPC 已经超出了对请求SEM_UNDO的进程数的限制IXPUB技术博客*BU9E%g s*n
ERANGE 操作会造成semval或semadj值得溢出IXPUB技术博客mvT@@J FLr
功能:
)Tkk@ e*S0semop函数在单个信号量集上原子的执行sops数组中指定的所有操作。如果其中任何一个单独的元素操作会使进程阻塞,进程就会阻塞而不会执行任何操作。IXPUB技术博客 q*YX7^I"W-uU#?
说明:IXPUB技术博客c&P0Q pt-[:`#{:f5a
结构struct sembuf指定了一个信号量元素操作,包含下列成员。IXPUB技术博客(d)G4z,C1dbQ-_-u,p
short sem_num   信号量元素的数量(信号量元素在信号量集中的序号)
I*mIi'H5v(p(~p%{0short sem_op   要执行的特定元素操作IXPUB技术博客7a7nvjj"b-w5Y m
short sem_flg   为操作指定选项的标志符IXPUB技术博客'o!a X%o X1u
sem_op如果是大于零的整数,semop就将这个值与sem_num号信号量元素相加,并唤醒所有等待该元素增加的进程。
&Z1g#w]]6K0  如果为零,且信号量元素值不为0,semop就会阻塞调用进程(进程在等待0),并增加等待那个信号量元素值变为零的进程计数。
U7o&` W;pCD#RjW0  如果sem_op为负数,那么,如果结果不能为负的话,semop就将sem_op值添加到相应的信号量元素值上去。如果操作可能会使元素值为负,semop就将进程阻塞在使信号量元素值增加的事件上。如果结果值为0,那么semop就唤醒等待0的进程。
yj y'}+RUZ p0              (五)共享内存
;]X9Nf"oI-\3p01.内核为每个共享内存设置了一个 shmid_ds结构,它的成员如下:
E6B+[ Wmu??;|0Struct shmid_ds{IXPUB技术博客 V8We ]u@kg
struct ipc_perm shm_perm;   //操作权限结构IXPUB技术博客,_,A Hp [t} uK
size_t     shm_segsz;   //用字节表示的段的长度
V1]DN9K0pid_t     shm_lpid;   //最后一个操作的进程ID
d8JVl4vZP5h0pid_t     shm_cpid;   //创建者的进程ID
f!Us9d4F.z` tMC0shmatt_t   shm_nattch   //当前连接的进程数量
mw%TBT0time_t     shm_atime;   //最后一次调用shmat的时间IXPUB技术博客,J7mY L*V0FT0D
time_t     shm_dtime;   //最后一次调用shmdt的时间
L/q G3VG0time_t     shm_ctime;   //最后一次调用shmtl的时间IXPUB技术博客'tPb.pA4n8d"i3yOc

^!nN&|*ck]n0
s0nYq^4`0}IXPUB技术博客P NBp\H7T
2.include<sys/shm.h> int shmget(key_t key, size_t size, int flag);//创建共享内存IXPUB技术博客 H_$B2PTo-r
size指的是共享内存段的格式n*sizeof(int)则共享内存段将用来存储int类型数据n个
"v"oN3le#?0成功返回一个对应于共享内存段标识符的非负整数,不成功返回-1并设置errno,错误码:IXPUB技术博客O'[`p!E5qo
EACCES   key的共享标识符存在,但没有授予相关的权限
g5_x8\_9c2c0EEXIST   key的共享标识符存在,但((shmflg&IPC_CREAT) && (shmflg&IPC_EXCL)!=0
_ c W:?5c4y5o I8l3b*w0EINVAL   要创建共享内存段,但size是无效的IXPUB技术博客1bei6F6baF
EINVAL   没有共享内存段要创建,但size与系统设置的限制或与key所代表的共享段的长度不相符IXPUB技术博客*[RKV)Q'` De
ENOENT   key的共享内存表示符不存在,但(shmflg&IPC_CREAT)== 0IXPUB技术博客4v9h0v @B,n J
ENOMEM   没有足够的内存空间来创建指定的共享内存段
^:i(r2q2M9g)B0ENOSPC   要超出系统范围内对共享标识符的限制了IXPUB技术博客{)Q oiP d+m;Y
功能:
t;A Q Ms ~v0shmget函数返回一个与参数key相关的共享内存段标识符。
Pn5Trq7WAh zo0如果键位IPC_CREAT或者shmflg&IPC_CREAT非零,而且没有共享内存段或标识符与key相关联,函数就创建这个段,共享内存段被初始化为零。IXPUB技术博客Qa8y~VF)@%o e
3. int shmctl(int shmid, int cmd, struct shmid_ds *buf);//共享内存的控制
L3]'yfe@0成功返回0,不成功返回-1并设置errno,错误码:
Zid%s P&Bg0EACCES   cmd为IPC_STAT,但是调用程序没有读权限IXPUB技术博客 Su6aGF_ JM
EINVAL   shmid或cmd的值无效IXPUB技术博客i/}P t9r2n
EPERM   cmd为IPC_RMID或IPC_SET,调用程序没有正确的权限
$drK(T/Ync8{0cmd值:IXPUB技术博客j5?;V'|(j$l
IPC_RMID 删除共享内存段,并销毁相应的shmid_dsIXPUB技术博客6o` xT~*b
IPC_SET   用buf中的值来设置共享内存段shmid的字段值
&]xd)[*c,J2i8P0IPC_STAT 将共享内存段shmid中的当前值拷贝到buf中去IXPUB技术博客 S[3L,r(O2T2E5}+CD
IPC_LOCK 将共享内存段锁定在内存中(只有超级用户可以执行)IXPUB技术博客'@,_3L {&Yr
    IPC_UNLOCK 解锁共享内存
o*A-z/r,ixl04.void *shmat(int shmid, const void *shmaddr, int shmflg);//共享内存段的连接IXPUB技术博客,Ld1u.g"nf
成功返回内存段的起始地址,不成功shmat返回-1并设置errno,必须检测的错误码:
{{2I]J P(G&K(X0EACCES   调用程序的操作权限别否定
_4HV!w4AZBXs0EINVLA   shmid和shmaddr的无效
^0A zO3YoD,jX0EMFILE   连接到进程上的共享内存段的树木超出了限制IXPUB技术博客'Lx9LR*pht
ENOMEM 进程数据空间不足以容纳共享内存段IXPUB技术博客Q(?'G?#M5xR2`
功能:
W$O?6}5hO0Ug;Y0函数将shmid指定的共享内存段连接到调用进程的地址空间,并为shmid增加shm_nattch的值。IXPUB技术博客"Y(rk ^Y;W"t9b
如果shmaddr为0,则此段连接到由内核选择的第一个可用的地址上
rl%_1cb8T9mV-^~0如果shmaddr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上
3H nee S1w0Q0Q0如果shmaddr非0,并且指定了SHM_RND,则此段连接到(addr-(addr mod ulus SHMLBA))所表示的地址上。
JON8cQu05. int shmdt(const void *shmaddr);//分离共享内存
f4R;S6] J A4J F8yB4N0成功返回0,不成功返回-1并设置errno,错误码:
n^*t,raS8c9B0EINVAL shmaddr不对应于共享内存段的起始地址IXPUB技术博客1j%YG/l(VLP4rl"{
功能:IXPUB技术博客Gt6u9b1{ { b(X5](a
用完一个共享内存,调用其来分离共享内存段,并对shm_nattch进行减操作。IXPUB技术博客d)L*ss7q }X
最后一个分离共享内存段的进程应该通过调用shmctl来释放共享内存段IXPUB技术博客.xB1Zjp7Z H7G
        (六)PGSQL编程IXPUB技术博客#d$L}GX'G*[
1.PGconn *PQconnectdb(const char *conninfo);//与数据库服务器建立一个新的连接
9Y4| DTb.p#o0conninfo可以包含的内容有:host,hostaddr, port, dbname, user, password, connect_timeout, options,tty,sslmode,requiressl,serviceIXPUB技术博客5c.V`E.f:e3v
2.//与数据库服务器建立一个新的连接(PQconnectdb的前身)
RK'{i4I*^P0PGconn *PQsetdbLogin(const char *pghost,//IP
YI;lN u ?}0            const char *pgport,//断口IXPUB技术博客J|U6W v5{
            const char *pgoptions,// 发送给服务器的命令行选项IXPUB技术博客9PxZ!M&u*d.uu&z
            const char *pgtty,//服务器日志的输出方向
` zfU&}0            const char *dbName,//数据库名IXPUB技术博客+H5t7_#k8W3[b xS
            const char *login,//用户IXPUB技术博客!KyaVnL
                const char *pwd);//密码IXPUB技术博客a.~X1ZSG V.zxb
3. PGconn *PQsetdb(char *pghost,char *pgport,     char *pgoptions,char *pgtty,char *dbName);//与数据库服务器建立一个新的连接IXPUB技术博客F iy,\G
这是一个调用 PQsetdbLogin() 的宏,只是login和pwd参数用空(null )代替。 提供这个函数是为了与非常老版本的程序兼容。
C:B,P"L^'kp!oa04. PGconn *PQconnectStart(const char *conninfo);IXPUB技术博客:D{6NB@Kc)C3z0T
PostgreSQLPollingStatusType PQconnectPoll(PGconn *conn);
/Wu;T2?9O&v0//与数据库服务器建立一个非阻塞的连接
3rb)pj Rj05. PQconninfoOption *PQconndefaults(void);//返回缺省的连接选项
*cnO^q ](w0typedef struct PQconninfoOptionIXPUB技术博客q/^]eqq
{
Emu-lf$O0char   *keyword;   /* 选项的键字 */IXPUB技术博客0y'kg5JJO8j#G
char   *envvar;   /* 退守的环境变量名 */
lz&Q#W;x0char   *compiled; /* 退守的编译时缺省值 */
1Z/Uv0p"rC0char   *val;     /* 选项的当前值,或者 NULL */
T U2q1CPx%~{;m0j0char   *label;   /* 连接对话里字段的标识 */
_6e Wl)S1j#r0char   *dispchar; /* 在连接对话里为此字段显示的字符。
(j$UKC(^0      数值有:IXPUB技术博客!`Ol[xF h'{@;i
              ""     原样现实输入的数值IXPUB技术博客 @1DAC/l-l*h
              "*"   口令字段 - 隐藏数值
/Bpm Vk,t.OA#M0              "D"   调试选项 - 缺省的时候不显示 */IXPUB技术博客e1Vf8NJI*M6Z
  int   dispsize; /* 对话中字段的以字符计的大小 */IXPUB技术博客8S~+yA N}4tt$]2_-J$m
}PQconninfoOption;
$l~3CgT3a06. void PQfinish(PGconn *conn);//关闭连接IXPUB技术博客5AB3Ty9RTd
7. void PQreset(PGconn *conn);//重建新的连接
(xQUb!N/Pl08. //以非阻塞模式重置与服务器的通讯端口。
!c _)PJ7D0int PQresetStart(PGconn *conn);
PG``K4W5ta0PostgreSQLPollingStatusType PQresetPoll(PGconn *conn);IXPUB技术博客+cf&S5K'{6E(y
9. char *PQdb(const PGconn *conn);//返回连接的数据库名IXPUB技术博客q3B!A\&L8e|
10. char *PQuser(const PGconn *conn);//返回连接的用户名IXPUB技术博客2P2@0sb[v*|n7nU3bh"R
11. char *PQpass(const PGconn *conn);//返回连接密码
zU X rh3}z012. char *PQhost(const PGconn *conn);//返回连接主机名IXPUB技术博客 }h8x!c C8VcZv^
13. char *PQport(const PGconn *conn);//返回连接端口IXPUB技术博客`l8FBP
14. char *PQtty(const PGconn *conn);//返回连接的调试控制台TTY
S8i1gf@.U F S015. char *PQoptions(const PGconn *conn);//返回连接请求传递的命令行选项IXPUB技术博客 m3s(d-v(N:gHTLp
16. ConnStatusType PQstatus(const PGconn *conn);//返回连接状态IXPUB技术博客"}3YwJ.k{p&C m]"U
  这个状态可以是一系列值之一。 不过,我们在一个异步连接过程外面只能看到其中的两个: CONNECTION_OK 或 CONNECTION_BAD。一个与数据库的成功的连接返回状态 CONNECTION_OK。 一次失败的企图用状态 CONNECTION_BAD 标识。 通常,一个 OK 状态将保持到 PQfinish,但是一个通讯失败可能会导致状态过早地改变为 CONNECTION_BAD 。这时应用可以试着调用 PQreset 来恢复。
"L X f5Q8\/f0t;P017. PGTransactionStatusType PQtransactionStatus(const PGconn *conn);IXPUB技术博客DBMp;lQ+t
//返回当前服务器的事务内状态。IXPUB技术博客6x7T2uSisur"B
状态可以是 PQTRANS_IDLE (当前空闲), PQTRANS_ACTIVE (正在处理一个命令), PQTRANS_INTRANS (空闲,在一个合法的事务块内),或者 PQTRANS_INERROR (空闲,在一个失败的事务块内)。如果连接有问题,则返回 PQTRANS_UNKNOWN。只有在一个查询发送给了服务器并且还没有完成的时候才返回 PQTRANS_ACTIVE。
z5S1zouqz O/T018. const char *PQparameterStatus(const PGconn *conn, const char *paramName);// 查找服务器的一个当前参数设置IXPUB技术博客f3v5\.B"Ln/fh D
19. int PQprotocolVersion(const PGconn *conn);查询所使用的前/后端协议。IXPUB技术博客j.b:~r h S2[+SC:D
20. int PQserverVersion(const PGconn *conn);//返回服务器的版本
@0_!_,W{1Ga021. char *PQerrorMessage(const PGconn *conn);// 返回连接中操作产生的最近的错误信息。
f\L:a-sS3o;UY022. int PQsocket(const PGconn *conn);// 获取与服务器连接的套接字的文件描述符编号。 一个有效的描述符应该是大于或等于 0;结果为 -1 表示当前没有与服务器的连接打开。 (在正常的操作中,这个结果不会改变,但是可能在启动或者重置的过程中变化。)IXPUB技术博客vu.@v1w]'w
23. int PQbackendPID(const PGconn *conn);// 返回处理此连接的服务器服务器的进程号ID(PID)。IXPUB技术博客ajIn7Jd r x
24. SSL *PQgetssl(const PGconn *conn);// 返回连接使用的 SSL 结构,或者如果没有使用 SSL 的话返回 NULL。IXPUB技术博客}JmvE!k*p o
25. PGresult *PQexec(PGconn *conn, const char *command);// 给服务器提交一条命令并且等待结果。
!NkCN1Qz;h&N{026. PGresult *PQexecParams(PGconn *conn,
8g"Zo ^ CD%A0              const char *command,
hnbx#{O2S0              int nParams,
6s&^.t2JDzqZ0              const Oid *paramTypes,IXPUB技术博客"uPU9e l6DF:Ei
              const char * const *paramValues,
i L e];ry0              const int *paramLengths,IXPUB技术博客5@\Rcg;|6u[Qr'Y
              const int *paramFormats,IXPUB技术博客U E ~K8U/]Z
              int resultFormat);IXPUB技术博客~0`k9} e'N&S| x
//向服务器提交一条命令并且等待结果,还有额外的传递与 SQL 命令文本独立的参数的能力。IXPUB技术博客1JqH4n5_9s3I+_{%G9h&k
27. 用给定的参数提交请求,创建一个准备好的语句,然后等待结束。
Tk o:^bAi0PGresult *PQprepare(PGconn *conn,IXPUB技术博客k.tb|2n|
            const char *stmtName,
A bMkf(W-GP0            const char *query,
-M%TG3~ g0            int nParams,
2yg0~H sT"|0            const Oid *paramTypes);
OK3u+}kl028. PGresult *PQexecPrepared(PGconn *conn,
#p'U;R/@g0                const char *stmtName,
K'[ l ~,H*p+{B6W0                int nParams,IXPUB技术博客F+uA1Na MIe ^h8{
                const char * const *paramValues,
g\3x1S$sk@0                const int *paramLengths,
-`|TL.t P#DaO0                const int *paramFormats,IXPUB技术博客I%?O/y_\]!KzGd z m
                int resultFormat);IXPUB技术博客7]"Vd+K:C[
//发送一个请求,执行一个带有给出参数的准备好的语句,并且等待结果。
M$yTO'O]UD029. 返回命令的结果状态。
+F h6lG-Q0ExecStatusType PQresultStatus(const PGresult *res);
'S%j_^xZB4D3R0PQresultStatus可以返回下面数值之一:IXPUB技术博客TGz.GCYCZ
PGRES_EMPTY_QUERY 发送给服务器的字串是空的IXPUB技术博客.O{)al;{gNN
PGRES_COMMAND_OK 成功完成一个不返回数据的命令IXPUB技术博客g}ddN1{2C0a
PGRES_TUPLES_OK 成功执行一个返回数据的查询查询(比如 SELECT 或者 SHOW)。IXPUB技术博客 O9iW c7g
PGRES_COPY_OUT (从服务器)Copy Out (拷贝出)数据传输开始IXPUB技术博客^T`j~"m
PGRES_COPY_IN Copy In (拷贝入)(到服务器)数据传输开始
tZ_.Kyt0PGRES_BAD_RESPONSE 服务器的响应无法理解IXPUB技术博客o~[ @ d
PGRES_NONFATAL_ERROR 发生了一个非致命错误(通知或者警告)PGRES_FATAL_ERROR 发生了一个致命错误
_*X l~n030. char *PQresStatus(ExecStatusType status);// PQresStatus 把PQresultStatus返回的枚举类型转换成一个描述状态码的字符串常量。 调用者不应该释放结果。
3G3gS |I]Z;a9X031. char *PQresultErrorMessage(const PGresult *res);IXPUB技术博客5W;sb U,]5yv}(K7}
  返回与查询关联的错误信息,或在没有错误时返回一个空字符串。
f7n aRT'uY0如果有错误,那么返回的字串将包括一个结尾的新行。调用者不应该直接释放结果。在相关的 PGresult 句柄传递给 PQclear 之后,它会自动释放。
v6Z\7Kf-Z2Sg032. char *PQresultErrorField(const PGresult *res, int fieldcode);IXPUB技术博客OO ZXH;l;Y{F
// 返回一个独立的错误报告字段。
gR o-t[A o033. void PQclear(PGresult *res);// PQclear 释放于PGresult相关联的存储空间。 任何不再需要的查询结果在不需要的时候都应该用PQclear释放掉。IXPUB技术博客_:q;U`5M.n}Nc3`U
34. PGresult* PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);IXPUB技术博客%R wT5o.G|v3XK)_
// 构造一个带有给出的状态的,空的PGresult对象。
#ZqzY rp7Jj nu035. int PQntuples(const PGresult *res)//返回查询结果里的行(元组)个数。 36. int PQnfields(const PGresult *res);
HhT])l"`8P)Ai0// 返回查询结果里数据行的数据域 (字段)的个数。
AVZ9P7feV J037. char *PQfname(const PGresult *res, int column_number);
,}g,zYE7m0// 返回与给出的数据域编号相关联的数据域(字段)的名称。数据域编号从 0 开始。调用者不应该直接释放结果。在相关联的 PGresult 句柄传递给 PQclear 之后,结果会被自动释放。
{:J2e8wK'EK)M&u038. int PQfnumber(const PGresult *res,const char *column_name);IXPUB技术博客E fn+K5ah,\1W3z
//返回与给出的数据域名称相关联的数据域(字段)的编号。IXPUB技术博客.Q#MxDHnsG
39. Oid PQftable(const PGresult *res, int column_number);
uIT)`SA0//返回我们抓取的字段所在的表的 OID。字段编号从 0 开始。
VS+Q"Km|"i040. int PQftablecol(const PGresult *res, int column_number);
zPJ2a5u:p0//返回组成声明的查询结果字段的字段号(在它的表内部)。查询结果字段编号从 0 开始,但是表字段编号不会是 0。IXPUB技术博客)n't+e(px9e-QeI[
41. int PQfformat(const PGresult *res, int column_number);IXPUB技术博客-I P PIq3IS FI]-f
  //返回说明给出字段的格式的格式代码。0开始
d%? iE {6w2VC0S/}042. Oid PQftype(const PGresult *res, int column_number);
7`:lc EBkt0// 返回与给定数据域编号关联的数据域类型。 返回的整数是一个该类型的内部 OID 号。数据域编号从0 开始。
H2UtzS043. int PQfmod(const PGresult *res, int column_number);
(tN:xH_8}0// 返回与给定字段编号相关联的类型修饰词。 字段编号从 0 开始。IXPUB技术博客7v]Nfi
44. int PQfsize(const PGresult *res, int column_number);IXPUB技术博客:w6s`~;b+cE:_b p
//返回与给定字段编号关联的字段以字节计的大小。 字段编号从0 开始。IXPUB技术博客5e#je,k0c
45. int PQbinaryTuples(const PGresult *res);IXPUB技术博客h#fSac
//如果PGresult包含二进制元组数据时返回 1如果包含 ASCII数据返回 0。IXPUB技术博客[e j(\7l"f S
46. char *PQgetvalue(const PGresult *res,int row_number, int column_number);//返回一个PGresult 里面一行的单独的一个字段的值。IXPUB技术博客.b2Nb+\bAJ
47. int PQgetisnull(const PGresult *res,int row_number, int column_number);IXPUB技术博客;_Q'Q"uaxmg
//测试一个字段是否为空(NULL)。行和字段编号从 0 开始。
Q a)b{,iqFUM$x6u048. int PQgetlength(const PGresult *res,int row_number,int column_number);//返回以字节计的字段的长度。行和字段编号从 0 开始。IXPUB技术博客9o+qRNX:xn ~nu
49. char *PQcmdStatus(PGresult *res);
O/t0]E!HNe]0// 返回产生PGresult的 SQL 命令的命令状态字符串。
NqC7mq%o050. char *PQcmdTuples(PGresult *res);// 返回被 SQL 命令影响的行的数量。 51. Oid PQoidValue(const PGresult *res); // 返回一个插入的行的对象标识   (OID)—— 如果SQL 命令是INSERT,或者是一个包含合适 INSERT 语句的准                   备好的 EXECUTE的时候。否则,函数返回 InvalidOid。如果受 INSERT 影响的                           表不包含 OID, 也返回 InvalidOid。IXPUB技术博客NB3|h h(so2HS
52. char *PQoidStatus(const PGresult *res);//如果 SQL 命令是INSERT,或者包含合适 INSERT 的准备好语句 EXECUTE 了 。返回一个被插入的行的 OID 的字串。 (如果 INSERT 并非恰好插入一行,或者目标表没有OID,那么字串将是 0。) 如果命令不是INSERT,则返回一个空字串。
w$MX.]_.V2q053. int PQsendQuery(PGconn *conn, const char *command);
,`1h1K!i;dt#P"e;@0//向服务器提交一个命令而不等待结果。 如果查询成功发送则返回 1,否则返回 0。 (此时,可以用PQerrorMessage获取关于失败的信息)。IXPUB技术博客+u(^)\"X0c[#O
54. int PQsendQueryParams(PGconn *conn,
#N'fUi*q(@7dW0              const char *command,
(FN gR~1FO!J q a0              int nParams,IXPUB技术博客p \ lF'm/n0@*o [
              const Oid *paramTypes,
xK%n(}_n @N0              const char * const *paramValues,IXPUB技术博客aqlRb"e'}9}a8DQ
              const int *paramLengths,
'p g`)sDz0              const int *paramFormats,IXPUB技术博客O-r_2w(Oi9EL n5s
              int resultFormat);
:U-GEKsRM.FA(`~5|0// 给服务器提交一个命令和(命令需要的)分隔的参数,而不等待结果。IXPUB技术博客 |/] bv-[&c9] k
55. int PQsendPrepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes);
1|?%w3a'X0f5w J0//发送一个请求,创建一个给定参数的准备好语句,而不等待结束。IXPUB技术博客o5UDT.SO-[q;I
56. int PQsendQueryPrepared(PGconn *conn,
R eG-N$I}0                const char *stmtName,IXPUB技术博客!|LQ'NI/[ W \
                int nParams,IXPUB技术博客|&X Bt`_*NB
                const char * const *paramValues,
E"w| n,Y @p&vl3xQ0                const int *paramLengths,
e%P8s^D0                const int *paramFormats,IXPUB技术博客9R6Ek#O }
                int resultFormat);IXPUB技术博客(^3R%x1y"KT|0d
//发送一个执行带有给出参数的准备好的语句的请求,不等待结果。IXPUB技术博客p"A2j!D$KL E!\[
57. PGresult *PQgetResult(PGconn *conn);
.f]8?6`(L/\$W0//等待从前面 PQsendQuery,PQsendQueryParams, PQsendPrepare, 或者 PQsendQueryPrepared 调用返回的下一个结果, 然后返回之。当命令结束并且没有更多结果后返回 NULL。
Q/t'W;ld:_"C3?058. int PQconsumeInput(PGconn *conn);IXPUB技术博客9l|c+{q6[N
// 如果存在服务器来的输入可用,则使用之。IXPUB技术博客oh.~|&X gqZW
59. int PQisBusy(PGconn *conn);IXPUB技术博客;rd$h W&|
// 在查询忙的时候返回 1 ,也就是说,PQgetResult 将阻塞住等待输入。一个 0 的返回表明这时调用 PQgetResult等以确保不阻塞IXPUB技术博客X&Z;clQ9^
60. int PQsetnonblocking(PGconn *conn, int arg);// 把连接的状态设置为非阻塞。 如果arg为 1,把连接状态设置为非阻塞, 如果arg为 0, 把连接状态设置为阻塞。如果 OK 返回 0,如果错误返回 -1。IXPUB技术博客8W;rcuhPPR R
61. int PQisnonblocking(const PGconn *conn);
2muIQ!YE-r/V?c)nK0// 返回数据库连接的阻塞状态。 如果连接设置为非阻塞状态,返回 1,如果是阻塞状态返回 0。IXPUB技术博客mpL,v Z }-g
62. int PQflush(PGconn *conn);
#zM4c;v~8^:dQ\6k0// 试图把任何正在排队的数据冲刷到服务器,如果成功(或者发送队列为空 )返回 0,如果因某种原因失败返回 -1,或者是在无法把发送队列中的所有数据都发送出去,返回 1。(这种情况只有在连接不为阻塞模式的时候才会出现)。IXPUB技术博客l2U y wS8w8[
63. PGcancel *PQgetCancel(PGconn *conn);// 创建一个数据结构,这个数据结构包含通过特定数据库连接取消一个命令所需要的信息。IXPUB技术博客a Q zd3F
64. void PQfreeCancel(PGcancel *cancel);IXPUB技术博客[d{g3@(K
// 释放 PQgetCancel 创建的数据结构。IXPUB技术博客.J$O8v/F#G
65. int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);IXPUB技术博客 Qs~,cT0Y"?
// 要求服务器放弃处理当前命令。IXPUB技术博客.T esK K1E:Q&~*W
66. int PQrequestCancel(PGconn *conn); //要求服务器放弃处理当前命令。IXPUB技术博客nd/KtjQ
      (七)MYSQL编程IXPUB技术博客uvw:Mo
1.数据类型:
1V8i`+S._-n^0MYSQL
:e4J%CA Ic.MV5h@0這個結構表示對一個數據庫連接的句柄,它被用于幾乎所有的MySQL函數。
mfV(Cy5?0MYSQL_RES
P-H,F V[OKL0這個結構代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結果。從查詢返回的信息在本章下文稱為結果集合。
sloU0M$U^0}:u0MYSQL_ROWIXPUB技术博客a Sn'Y2hX8e&Nf
這是一個行數據的類型安全(type-safe)的表示。當前它實現為一個計數字節的字符串數組。(如果字段值可能包含二進制數據,你不能將這些視為空終止串,因為這樣的值可以在內部包含空字節) 行通過調用mysql_fetch_row()獲得。
L/M |9K:P_!b}0MYSQL_FIELDIXPUB技术博客"l z7]L_JW*ig2A
這個結構包含字段信息,例如字段名、類型和大小。其成員在下面更詳細地描述。你可以通過重複調用mysql_fetch_field()對每一列獲得MYSQL_FIELD結構。字段值不是這個結構的部分;他們被包含在一個MYSQL_ROW結構中。IXPUB技术博客f{ c6N} dC gf
MYSQL_FIELD_OFFSETIXPUB技术博客6J+y,M}wk)Hi
這是一個相對一個MySQL字段表的偏移量的類型安全的表示。(由mysql_field_seek()使用。) 偏移量是在一行以內的字段編號,從0開始。IXPUB技术博客f |9z4y0R8W'G
my_ulonglongIXPUB技术博客,r0~ E1D.N(Z
該類型用于行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。這種類型提供0到1.84e19的一個範圍。在一些系統上,試圖打印類型my_ulonglong的值將不工作。為了打印出這樣的值,將它變換到unsigned long並且使用一個%lu打印格式。例如:IXPUB技术博客O]dQ2R'd#Y
printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));IXPUB技术博客 Ksx,hp(k+_
MYSQL_FIELD結構包含列在下面的成員:
:K n4U^8}0char * name
'xI"w D|,Q r4p&QR0字段名,是一個空結尾的字符串。
H ^i$xgcmS0`*Re l0char * table
0I-o;^#N&]1I {0包含該字段的表的名字,如果它不是可計算的字段。對可計算的字段,table值是一個空字符串。
$wZ,P"SM?bgf`0char * defIXPUB技术博客&\to|#L;o L;m(Z
這字段的缺省值,是一個空結尾的字符串。只要你使用,只有你使用mysql_list_fields()才可設置它。
6lGhVS0enum enum_field_types typeIXPUB技术博客`r \0@+E
字段類型。type值可以是下列之一:IXPUB技术博客?%G l-S.J2Fu6x~
類型值             類型含義
8Aac*b g4FOa,w-G9Z0FIELD_TYPE_TINY     TINYINT字段IXPUB技术博客+N%K'g(P(YAt9p*n mQ
FIELD_TYPE_SHORT     SMALLINT字段IXPUB技术博客 z6t#Ef1q
FIELD_TYPE_LONG     INTEGER字段
.u E[2J#wpCN]-`0FIELD_TYPE_INT24     MEDIUMINT字段
}PJg'Vt u}0FIELD_TYPE_LONGLONG     BIGINT字段IXPUB技术博客@h$fnTi
FIELD_TYPE_DECIMAL     DECIMAL或NUMERIC字段
A4{&p7b,NI0}*p0FIELD_TYPE_FLOAT     FLOAT字段IXPUB技术博客"yF$`x:H@3K0Zg
FIELD_TYPE_DOUBLE     DOUBLE或REAL字段
VQ/V` rT }f@0FIELD_TYPE_TIMESTAMP     TIMESTAMP字段IXPUB技术博客MEfwQc
FIELD_TYPE_DATE     DATE字段IXPUB技术博客q#bs$RC2L1`U@ IeK
FIELD_TYPE_TIME     TIME字段IXPUB技术博客+J3yt#E/z4?*o? }
FIELD_TYPE_DATETIME     DATETIME字段
)q e Ip,[0FIELD_TYPE_YEAR     YEAR字段
$KK*j_V2Sk0FIELD_TYPE_STRING     字符串(CHAR或VARCHAR)字段
B*u5cgj5Q U O0FIELD_TYPE_BLOB     BLOB或TEXT字段(使用max_length決定最大長度)
;d^g\{ Hy nut8@4X0FIELD_TYPE_SET     SET字段
%?7g#dum3vW0FIELD_TYPE_ENUM     ENUM字段IXPUB技术博客bS?'~*q$a b8V;L
FIELD_TYPE_NULL     NULL- 類型字段
6D%ETN'mz0FIELD_TYPE_CHAR     不推薦;使用FIELD_TYPE_TINY代替
T+AO(g uc6z[P8lv0你可以使用IS_NUM()宏來測試字段是否有一種數字類型。將type值傳給IS_NUM()並且如果字段是數字的,它將計算為TRUE:IXPUB技术博客FH7cdmf
if (IS_NUM(field->type))
H;S'OQ*R|T;^a0  printf("Field is numeric\n");IXPUB技术博客ET9yt-X*hfT
unsigned int lengthIXPUB技术博客T tD U)Hg.q{
字段寬度,在表定義中指定。
-}1~;fL8B$w1A0unsigned int max_lengthIXPUB技术博客%v3m-Q+d fE0b;d3Eg0h
對結果集合的字段的最大寬度(對實際在結果集合中的行的最長字段值的長度)。如果你使用mysql_store_result()或mysql_list_fields(),這包含字段最大長度。如果你使用mysql_use_result(),這個變量的值是零。
'm3HiT-q0unsigned int flags
+j&US-n+Ps&N0字段的不同位標志。flags值可以是零個或多個下列位設置:
6x6p)c0G.[E&Dkn gk0標志值             標志含義IXPUB技术博客#t~/c)H_uU!a7t
NOT_NULL_FLAG     字段不能是NULL
rT+mc']7ty~0PRI_KEY_FLAG     字段是一個主鍵的一部分IXPUB技术博客hJh`F6Pz)A
UNIQUE_KEY_FLAG     字段是一個唯一鍵的一部分IXPUB技术博客+V|8Rr^ E
MULTIPLE_KEY_FLAG     字段是一個非唯一鍵的一部分。
/yGP8r)HU#Ag0UNSIGNED_FLAG     字段有UNSIGNED屬性IXPUB技术博客U5V:ZD u3U3d
ZEROFILL_FLAG     字段有ZEROFILL屬性IXPUB技术博客`h-wm4j.um
BINARY_FLAG     字段有BINARY屬性IXPUB技术博客3EH\OTnH s#a p7a(e
AUTO_INCREMENT_FLAG     字段有AUTO_INCREMENT屬性IXPUB技术博客G.f2T:k3h1VZ_%Q
ENUM_FLAG             字段是一個ENUM(不推薦)IXPUB技术博客[I&|P&i:_
BLOB_FLAG             字段是一個BLOB或TEXT(不推薦)IXPUB技术博客"X!V_/o4K h'EN6i
TIMESTAMP_FLAG     字段是一個TIMESTAMP(不推薦)IXPUB技术博客5f^$M#CMwA.R
BLOB_FLAG、ENUM_FLAG和TIMESTAMP_FLAG標志的使用是不推薦的,因為他們指出字段的類型而非它的類型屬性。對FIELD_TYPE_BLOB、FIELD_TYPE_ENUM或FIELD_TYPE_TIMESTAMP,最好是測試field->type。下面例子演示了一個典型的flags值用法:IXPUB技术博客-Bg$b2@i U |Sx
if (field->flags & NOT_NULL_FLAG)IXPUB技术博客-P9R+c6CCa.g3MJ#O}9pW"rH
  printf("Field can't be null\n");
oN{rDQ0你可以使用下列方便的宏決來確定flags值的布爾狀態:
GY9PX/xC0IS_NOT_NULL(flags)     真,如果該字段被定義為NOT NULLIXPUB技术博客"Csa4x!Tq@%^
IS_PRI_KEY(flags)     真,如果該字段是一個主鍵IXPUB技术博客#U2z~Dg&N"^$P(T
IS_BLOB(flags)     真,如果該字段是一個BLOB或TEXT(不推薦;相反測試field->type)IXPUB技术博客tW#|{)aY,x^;w
unsigned int decimalsIXPUB技术博客 xNM B2XA$YO$^
對數字字段的小數位數。IXPUB技术博客fiE)Z;s

~0HJy@'Zx3T m02. my_ulonglong mysql_affected_rows(MYSQL *mysql) 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。
Y2]3r~3Pwpg-n0I0  void mysql_close(MYSQL *mysql)     關閉一個服務器連接。
"Xl:L3{kJ^8Z'lj;u0
)N0m k G]0  MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)     連接一個MySQL服務器。該函數不推薦;使用mysql_real_connect()代替。
BBM'{ B,O1L0
wQ @7R`6[2o7@3H0  my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)     改變在一個打開的連接上的用戶和數據庫。
7irj9FqEc!b0IXPUB技术博客J:s'e3?/Ez(q3Y
  int mysql_create_db(MYSQL *mysql, const char *db)     創建一個數據庫。該函數不推薦;而使用SQL命令CREATE DATABASE。IXPUB技术博客 jBJ&a$ad| j

L'u b,u*M'vx0  void mysql_data_seek(MYSQL_RES *result, unsigned long long offset)     在一個查詢結果集合中搜尋一任意行。
Jmk*ci+ZIdlY0
5]LPs-Yk1F _3o0  void mysql_debug(char *debug)     用給定字符串做一個DBUG_PUSH。IXPUB技术博客(CQ0re$Y5G

Gm*U*jxC G#N.Ra[0  int mysql_drop_db(MYSQL *mysql, const char *db)     拋棄一個數據庫。該函數不推薦;而使用SQL命令DROP DATABASE。IXPUB技术博客S#C-_ B+Hn#[
IXPUB技术博客 b PdROjY
  int mysql_dump_debug_info(MYSQL *mysql)     讓服務器將調試信息寫入日志文件。IXPUB技术博客1rDt-x H$DZ5]^
IXPUB技术博客 S-hp;A,l0hw |7f,s
  my_bool mysql_eof(MYSQL_RES *result)     確定是否已經讀到一個結果集合的最後一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。IXPUB技术博客5r!iy,{%m7lh
IXPUB技术博客 @/I?-{/]
  unsigned int mysql_errno(MYSQL *mysql)     返回最近被調用的MySQL函數的出錯編號。
n{(Rt2@7bXQ0
/p6tHc~J(eG0  char *mysql_error(MYSQL *mysql)     返回最近被調用的MySQL函數的出錯消息。
xnt2z'O;f0
2BWS Gs+C`~0  unsigned int mysql_escape_string(char *to, const char *from, unsigned int length)     用在SQL語句中的字符串的轉義特殊字符。IXPUB技术博客Rz'H"~2j xk

#?/jHjL;W0  MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)     返回下一個表字段的類型。IXPUB技术博客,n:R_\/zPDx
IXPUB技术博客ghQ1X,~*bH
  MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)     返回一個表字段的類型,給出一個字段編號。
)bpKV+I0
0j:M;@cB$h0  MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)     返回一個所有字段結構的數組。IXPUB技术博客v l#P4YD8L
IXPUB技术博客%m(W.i5U7X*Q2vo8A
  unsigned long *mysql_fetch_lengths(MYSQL_RES *result)返回當前行中所有列的長度。
r w,UL!fe&x tk0IXPUB技术博客%Y|e?,\TwF
  MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)     從結果集合中取得下一行。IXPUB技术博客 N4i$`eD t!G
IXPUB技术博客^*U2Oed2^~Y~,B
  unsigned int mysql_field_count(MYSQL *mysql)     把列光標放在一個指定的列上。IXPUB技术博客5dE1hn#sJ2O C
IXPUB技术博客 XlySPU/iT
  MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)     返回最近查詢的結果列的數量。
il1r/`J-}5z9t-l0
o"IC-|2{ l0  MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)返回用于最後一個mysql_fetch_field()的字段光標的位置。IXPUB技术博客2R,Y6A6v@ YE

!t7|z7}[(T;{9@9a X0  void mysql_free_result(MYSQL_RES *result)     釋放一個結果集合使用的內存。IXPUB技术博客%zPd7k0rmS%E

1QL-ar0k \ {0  char *mysql_get_client_info(void)     返回客戶版本信息。IXPUB技术博客t0FDq+tf7G

K{L4_1{/A*z0  char *mysql_get_host_info(MYSQL *mysql)       返回一個描述連接的字符串。
hQ~4Wft1n0
X w'g3O/e)T ]0  unsigned int mysql_get_proto_info(MYSQL *mysql)     返回連接使用的協議版本。IXPUB技术博客8f7v!y@4t
IXPUB技术博客-}%@-@wZL
  char *mysql_get_server_info(MYSQL *mysql)     返回服務器版本號。
k*OTM h Mff0
EV;}5j fvB4c0  char *mysql_info(MYSQL *mysql)     返回關于最近執行得查詢的信息。IXPUB技术博客$k)t6_.c-V$t2xzF4Vu

+N C(]i3l:~3cr0  MYSQL *mysql_init(MYSQL *mysql)     獲得或初始化一個MYSQL結構。
:Y)D+X/M5~)x0IXPUB技术博客-p7] V$?B&f!i@
  my_ulonglong mysql_insert_id(MYSQL *mysql)返回有前一個查詢為一個AUTO_INCREMENT列生成的ID。IXPUB技术博客]8vCla"HZL\ Y;{?9F
IXPUB技术博客wHgn$Bq]5}9R
  int mysql_kill(MYSQL *mysql, unsigned long pid)     殺死一個給定的線程。
%N;YtU%VFOP$i0
N/Ds6a T0@ S Kg0  MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)     返回匹配一個簡單的正則表達式的數據庫名。
uG&ot D Y({0IXPUB技术博客D\q!c] n
  MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)     返回匹配一個簡單的正則表達式的列名。IXPUB技术博客&sI*^5h&nm)f

!q sft'} h"r(v/f(t+x&m0  MYSQL_RES *mysql_list_processes(MYSQL *mysql)     返回當前服務器線程的一張表。
R*kN n7~euJ;O0
`,F%tM"W5`0  MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)     返回匹配一個簡單的正則表達式的表名。
ufi}-KG^0IXPUB技术博客}f-dC-j*d"G
  unsigned int mysql_num_fields(MYSQL_RES *result)     返回一個結果集合重的列的數量。IXPUB技术博客9Sst*PHr|y(R

Ab7IW N1fo0  my_ulonglong mysql_num_rows(MYSQL_RES *result)     返回一個結果集合中的行的數量。IXPUB技术博客5?-`B$S^

oSX8U'gUPT:L0  int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)     設置對mysql_connect()的連接選項。
F6r5s z*yRo0IXPUB技术博客b8@3M3Nye#p c
  int mysql_ping(MYSQL *mysql)     檢查對服務器的連接是否正在工作,必要時重新連接。
L k q8C c j&Rxw$R"c7O0IXPUB技术博客 M,d2n0p0t j
  int mysql_query(MYSQL *mysql, const char *query)執行指定為一個空結尾的字符串的SQL查詢。
E {aI uFGiv0IXPUB技术博客z2K^%KV0{w
  MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)     連接一個MySQL服務器。IXPUB技术博客xn#eZ#uo`

s4wT7DCV0int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)     執行指定為帶計數的字符串的SQL查詢。IXPUB技术博客G }i1|2V
IXPUB技术博客@hM?!{Es
int mysql_reload(MYSQL *mysql)     告訴服務器重裝授權表。
!X@%S(z#?3l)Zv:`0IXPUB技术博客1L u._B1lX
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)     搜索在結果集合中的行,使用從mysql_row_tell()返回的值。
kFLLQ#wI`P4BQ t0
j6YL p(V}`0MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)     返回行光標位置。
d3M i4WW/@3| J rI\0IXPUB技术博客x2zt5BO(}_L
int mysql_select_db(MYSQL *mysql, const char *db)     連接一個數據庫。IXPUB技术博客:sV3R-G~[\'^

3p xw/W8I0int mysql_shutdown(MYSQL *mysql)     關掉數據庫服務器。
y2AY2zj}(RP0IXPUB技术博客 ?6s4w1AcA%['HV(VP
char *mysql_stat(MYSQL *mysql)     返回作為字符串的服務器狀態。
0z OD7sq})nf0IXPUB技术博客*BL4MS/@(S,|5S
MYSQL_RES *mysql_store_result(MYSQL *mysql)     檢索一個完整的結果集合給客戶。IXPUB技术博客 }k%qT _9`'O2lKg

6g/g3~ V(}&x0unsigned long mysql_thread_id(MYSQL *mysql)     返回當前線程的ID。IXPUB技术博客(qs1S2YV[ a:l
IXPUB技术博客_$k)L)c1]!CC
MYSQL_RES *mysql_use_result(MYSQL *mysql)     初始化一個一行一行地結果集合的檢索。IXPUB技术博客0IY|ic"W;e8b
         
$Q9Kh h sq~0(八)网络编程
p5H5`.R+T[]0  1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。IXPUB技术博客H1[;{ }nP3la
#include<socket.h>
(t r'q"Ol5vh!i0int socket(int family, int type, int protocol);//成功返回非负描述字;失败返回-1
^(rk/`k't!^,]0  第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明 套接口类型,有三种类型可选:SOCK_STrEAM(字节流套接口)、SOCK_DGrAM(数据报套接口)和SOCK_rAW(原始套接口);如果套 接口类型不是原始套接口,那么第三个参数就为0。
/Ql u:}|g WX0IXPUB技术博客?\1{.DdNV
  2、connect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。IXPUB技术博客*U\y'w:F
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
Ho+Y4I3rBIq7r0//成功返回0;失败返回-1
/Q}j u` Fm9|0  第一个参数是socket函数返回的套接口描述字;第二和第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。IXPUB技术博客 m$Le(\ J/c!u
  这些地址结构的名字均已“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。以IPv4套接口地址结构为例,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>;以下是结构体的内容:
U _#o#_ AW!V0struct in_addr {
s ]1GUvP IR0in_addr_t s_addr; //IPV4地址
/p vD0LN0};IXPUB技术博客IEA"M @(\Z'R)?
struct sockaddr_in {
C-}4a_'}:Gv(l Qg0uint8_t sin_len;//无符号的8位整数
q/v)DdJ0sa_family_t sin_family;//套接口地址结构地址族,这里为AF_INET
6\N+M*eE,J0in_port_t sin_port;//TCP或UDP端口
A)hC hjL2VH0struct in_addr sin_addr;//地址IXPUB技术博客5o L4R,Ro$L(vz
char sin_zero[8];
~|Uj4ky0};
2oxS4M3b+y b]@0IXPUB技术博客&UPW"I2U0IU6r
  3、bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的 TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地 IP地址。IXPUB技术博客0y9}7Sb1L8J~ha
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);//成功0失败-1
D oI#p\-?.u9j(uI0  第一个参数是socket函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。IXPUB技术博客&m't9p)c s3J

4TQ3D#uQ-VFK0  4、listen函数:listen函数仅被TCP服务器调用,它的作用是将用sock创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。
h[b:vp GB/l a0int listen(int sockfd, int backlog);//成功返回0;失败-1IXPUB技术博客syE4@(\0Q"o
第一个参数是socket函数返回的套接口描述字;第二个参数规定了内核为此套接口排队的最大连接个数。由于listen函数第二个参数的原 因,内核要维护两个队列:以完成连接队列和未完成连接队列。未完成队列中存放的是TCP连接的三路握手为完成的连接,accept函数是从以连接队列中取 连接返回给进程;当以连接队列为空时,进程将进入睡眠状态。IXPUB技术博客u] c3n'fenl
  5、accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。
q0\bu|0int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen);  IXPUB技术博客^-R bql r
// 返回:非负描述字---成功   -1---失败IXPUB技术博客&pS3]6v$q} \8F$TG
  第一个参数是socket函数返回的套接口描述字;第二个和第三个参数分别是一个指向连接方的套接口地址结构和该地址结构的长度;该函数返回的是一个全新的套接口描述字;如果对客户段的信息不感兴趣,可以将第二和第三个参数置为空。
B/^3Hxj9H@ ~0IXPUB技术博客1f-@-rhR3q
  6、inet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。IXPUB技术博客xO4P'v$W1cK8D
int inet_pton(int family,const char * strptr,void * addrptr);IXPUB技术博客!p/BhO y
//返回:1---成功 0---输入不是有效的表达格式 -1---失败IXPUB技术博客~L!i;g-vsCL"BKAg
  第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。IXPUB技术博客\.m3hc;X;V6x(ev S
IXPUB技术博客4]l&x3| J txL
  7、inet_ntop函数:和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
_dVnE,e t0e0const char * inet_ntop(int family,const void *addrptr,char * strptr,size_t len);
N1k2^hM0//返回:指向结果的指针---成功   NULL---失败IXPUB技术博客&lJ Y\5L2k p
  第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
[(N|$Hjf a0     8. int send(int sockfd, const void *msg, int len, int flags);
^ m!N2K _ u,qx0  Sockfd是你想用来传输数据的socket描述符,msg是一个指向要发送数据的指针。
,j"}m1X\6_ @O.g0  Len是以字节为单位的数据的长度。flags一般情况下置为0(关于该参数的用法可参照man手册)。IXPUB技术博客 ERDD.OgY9F#d3k7[$~8AZ
  char *msg = "Beej was here!"; int len, bytes_sent; ... ...IXPUB技术博客"\%])^xs-[f0u#E
  len = strlen(msg); bytes_sent = send(sockfd, msg,len,0); ... ...
fM:sG"}] t l'}+x0  send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。所以需要对send()的返回值进行测量。当send()返回值与len不匹配时,应该对这种情况进行处理。
if/Y[`0
zn#D5bHm2th0  9.int recv(int sockfd,void *buf,int len,unsigned int flags);
~N0E~'t0  Sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。Flags也被置为0。Recv()返回实际上接收的字节数,或当出现错误时,返回-1并置相应的errno值。
-Q6Kx&g8G n+j0  10. int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);
HR"P hb1c0  该函数比send()函数多了两个参数,to表示目地机的IP地址和端口号信息,而tolen常常被赋值为sizeof (struct sockaddr)。Sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。
\_a+h'Bac#c0Gu0  11. int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);IXPUB技术博客%Ux hM$p"QJ3X
   from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof(struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或 当出现错误时返回-1,并置相应的errno。
$K%nh{+e!z0Bq*O,s0  应注意的一点是,当你对于数据报socket调用了connect()函数时,你也可以利用send()和recv()进行数据传输,但该socket仍然是数据报socket,并且利用传输层的UDP服务。但在发送或接收数据报时,内核会自动为之加上目地和源地址信息。IXPUB技术博客H"?1T5xY Ww0s
  12. struct hostent *gethostbyname(const char *name); //实现域名和IP的转换IXPUB技术博客1bi Eu+s&X
  函数返回一种名为hosten的结构类型,它的定义如下:
4Bwv2z'wOs;X;}s0  struct hostent {
[p*g$tLj \9c}A0     char *h_name; /* 主机的官方域名 */IXPUB技术博客A5e}fiscwm y8y
     char **h_aliases; /* 一个以NULL结尾的主机别名数组 */IXPUB技术博客'uLo~$ut"b+b.\
     int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */IXPUB技术博客 U9_ Xb-{O/EGwW
     int h_length; /*地址的字节长度 */
,]!s%I;NJcViC0     char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/IXPUB技术博客 bq Pbs}]!A7S5AS
     };IXPUB技术博客,C fa^$\8?X'T

#~$gm:z1t5|'F013. int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
C X AZ|_P0int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
eH ZG.w:\1q0IXPUB技术博客6Bx2o1N6HW
level指定控制套接字的层次.可以取三种值: 1)SOL_SOCKET:通用套接字选项. 2)IPPROTO_IP:IP选项. 3)IPPROTO_TCP:TCP选项.IXPUB技术博客'?-Y5Mfr Xi h&F)o
optname指定控制的方式(选项的名称),我们下面详细解释IXPUB技术博客4Yx8y$Lg9\.kU.~

(E6W1ChHtC]0optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换IXPUB技术博客4n k6dE t
IXPUB技术博客'Pj%_7t7?UTR

gQ [C sg0选项名称 说明 数据类型
6l9Y1f-n.I#dy#v(Mc0========================================================================IXPUB技术博客R M bXGX9K;O
SOL_SOCKET
|#nP5o_C3T2q'V0------------------------------------------------------------------------
nH_uIQhy[?u0SO_BROADCAST 允许发送广播数据 int
*WG#}Vi EA5y2L9F6c0SO_DEBUG 允许调试 int
3Ze)W X6nRU0SO_DONTROUTE 不查找路由 int
u"P7d&S0q0SO_ERROR 获得套接字错误 int
"d)}k%?(P0A0SO_KEEPALIVE 保持连接 intIXPUB技术博客 ?:j&xb"\6N+~/^P h
SO_LINGER 延迟关闭连接 struct lingerIXPUB技术博客F#kCc&l;Q,f R%Fd-G
SO_OOBINLINE 带外数据放入正常数据流 intIXPUB技术博客&`7W L%c6{/DL0y{
SO_RCVBUF 接收缓冲区大小 intIXPUB技术博客\6_?9~F Z(e!N6m1s
SO_SNDBUF 发送缓冲区大小 intIXPUB技术博客MwQk4?od`
SO_RCVLOWAT 接收缓冲区下限 int
9ga'?X {;y0SO_SNDLOWAT 发送缓冲区下限 intIXPUB技术博客H7hU2J2xP8}({1x
SO_RCVTIMEO 接收超时 struct timeval
hB%EF+I%v0SO_SNDTIMEO 发送超时 struct timeval
aQI,ob(l nR0SO_REUSERADDR 允许重用本地地址和端口 int
CP:M\ SO0SO_TYPE 获得套接字类型 int
0u9xAOt5ai/v0SO_BSDCOMPAT 与BSD系统兼容 int
g%Blq/^/^0======================================================================
bjx#M u,qg:kI"RW:o0IPPROTO_IPIXPUB技术博客7v5C-Ro%z|9@s0?
--------------------------------------------------------------------------IXPUB技术博客bfc7Lt}a
IP_HDRINCL 在数据包中包含IP首部 int
2y8A$I#}W9P0k$\.y,M0IP_OPTINOS IP首部选项 intIXPUB技术博客 v z2z-V {Z"M`"T
IP_TOS 服务类型
,P#]iYmi"J0IP_TTL 生存时间 intIXPUB技术博客vl B ``{1M4^
======================================================================IXPUB技术博客 E/_W D(BFZ;wc-W
IPPRO_TCPIXPUB技术博客K9Nr%Vj @~Bi%u;uZ
--------------------------------------------------------------------------
.EyY~${*[.@0TCP_MAXSEG TCP最大数据段的大小 intIXPUB技术博客d/A?[;h8q"e+Y
TCP_NODELAY 不使用Nagle算法 int
+Zp(iG S ?0======================================================================
m"Mx0I/k0关于这些选项的详细情况请查看 Linux Programmer''s ManualIXPUB技术博客??:g0Gz*yb&I)y9Y
14. TCP客户端的过程
MSW'H:gk L`0  socket()->[*对所要连接的server对应的sockaddr_in结构中的sin_family,sin_addr.s_addr,sin_port赋值*]->connect()-> { write()->read()-> } close()
8d#`8[.f5q+iq0    TCP服务端的过程
q$M?NaKg g0  socket()->[*对server所对应的sockaddr_in机构中的sin_family,sin_addr.s_addr,sin_port进行赋值*]->bind()->listen()->{ accept()-> read()->write()-> }close()
d-I2uB@0
#o!P5H?#@7`^015.UDP客户的过程IXPUB技术博客8M3i6v"\I'? F
  [*对所要连接的server对应的sockaddr_in结构中的sin_family,sin_addr.s_addr,IXPUB技术博客Oz:t7ito,m
sin_port赋值*]->socket()->{ sendto()->recvfrom()-> } close()
pd{(Y!Rt^E0UDP服务端的过程IXPUB技术博客w/N2l/Q2Wd
  socket()->[对server对应的sockaddr_in结构中的sin_family,sin_addr.s_addr,
r:D%d%Q+L#t ` M0sin_port赋值] –>bind()->{ recvfrom()->sendto()-> }close()
m#l/u'IN"v l0         (九)文件访问
BO5mZ(jm5u01. #include<fcntl.h>IXPUB技术博客3P[gDX+S
  int open(const char *pathname, int oflag, …)//打开或创建文件
"JU1tcSCe0  若成功返回文件描述符,出错返回-1;参数说明:IXPUB技术博客ATZV;|8w8O
  pathname:要打开或创建文件的名字
9m$tZW n:IT0oflag:以下三个只选其一:IXPUB技术博客 n&Q,cO R+h
O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)
;kqYZG x0以下可选:
d'rl/Zj\&yh/E0O_APPEND 每次写时都追加到文件的尾端
Eim2~gbD R)c9Xrr0    O_CREAT 若此文件不存在,则创建它(需第三个参数来指定权限)
Q/HDK/CPq;y-u|0    O_EXCL 如果同时指定了CREAT而文件已经存在则出错。
9F7fwYZ#Y P,U0    O_TRUNC 如果此文件存在而且为只写或只读,则将其长度截为0IXPUB技术博客Hp)Sg1Tj T)z{
    O_NOCTTY 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。IXPUB技术博客 ?/g`}cl d RG
    O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/0操作设置非阻塞模式
1IX-S0u4~0    O_DSYNC 使每次write等待物理I/0操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新。
x{!cBg UQ0    O_RSYNC 使每一个以文件描述符作为参数的read操作等待,直至任何对文件同一部分进行的未决写操作都完成
7p L(h9W6~a*]0    O_SYNC 使每次write都等到物理I/O操作完成,包括由write操作引起的文件属性更新所需的I/0。IXPUB技术博客)U {v*}5C]X` V&S
 IXPUB技术博客&zhUc cQ.F3?q
2.creat(const char *pathname, mode_t mode);//创建文件
)nk"De6Q8{%E0若成功返回只写打开的文件描述符,失败返回-1
#D^w)E Q k0相当于open(pathname, O_WRONLY | O_CREAT | O_TRUNC,mode)
2?0r;Lv5Q o0mode的选项:IXPUB技术博客"K }p(p2^;Hy
S_IRUSR   // user-read(文件所有者读)
L4t C7S8Aee0  S_IWUSR   // user-write(文件所有者写)IXPUB技术博客L1D O%PG{)CE }
  S_IXUSR   // user-execute(文件所有者执行)IXPUB技术博客 ^8v"a1X;b
  S_IRGRP   // group-read
7Z?-z tk[Z2m0z0  S_IWGRP   // group-write
/D%`\R\mN0  S_IXGRP   // group-execute
+y.P,QoP&pF~I7G I0  S_IROTH   // other-read
PoP9e1T9D ve4x0  S_IWOTH   // other-write
Y3v {q}4r*|.j0  S_IXOTH   // other-executeIXPUB技术博客St+Gq-r^"{w\
3.int close(int filedes)//关闭打开的文件;成功返回0,失败返回-1IXPUB技术博客*_ U(?%G x]cB
4.off_t lseek(int filedes, off_t, int whence)IXPUB技术博客't"|kzG s0~
//为一个打开的文件设置其偏移量,成功返回新的文件偏移量 出错返回-1IXPUB技术博客k,g:[ _E+_7Ta2W
若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
p z6j4F4O4N0若whence是SEEK_CUR,则将该文件的偏移量设置为当前值加offset(可正、负)IXPUB技术博客mX(he:r&A z,`m
若whence是SEEK_END,则将该文件偏移量设置为文件长度加offset(可正、负)
4\Xg yAi0y05.ssize_t read(int filedes, void *buf, size_t nbytes);//从打开的文件中读数据;成功返回读到的字节数,若已到文件结尾则返回0,出错返回-1
q+@?Oe7|V{[\06.ssize_t write(int filedes, const void *buf, size_t nbytes)
6zG6?:M.Y?P0//向打开的文件写数据;若成功则返回已写的字节数,出错则返回-1
^9M(vC X5Xy07.ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);IXPUB技术博客+jLk RR5jL-m
//指定偏移量读文件;返回读到的字节数,已到文件结尾返回0,出错返回-1
w$G;{WO,~7^{_#ji08.ssize_t pwrite(int filedes, void *buf, size_t nbytes, off_t offset);
t.P6G A@A\0//指定偏移量写文件;返回写入的字节数,若出错则返回-1IXPUB技术博客f*Z[4Ol^
9.int dup(int filedes);//复制一个现存的文件描述符
X_BdBL%h*Ud q0int dup2(int filedes, int filedes2)//将filedes复制到filedes2
5L5YM e-[Tn'Cx0//若成功则返回新的文件描述符,若出错则返回-1
^/~+zv Ad-md010.#include<fcntl.h>IXPUB技术博客:P/KGi z$^/P9it7?{F
int fcntl(int filedes, int cmd, …);//改变已打开的文件的性质IXPUB技术博客3z L|qu^1Q;N$h
若成功则依赖cmd,若出错则返回-1,主要有5种功能:
s#jr+BH@3t0(1)复制一个现有的描述符(cmd = F_DUPFD)IXPUB技术博客/] WK)?)y?"i
  复制文件描述符filedes,返回新文件描述符IXPUB技术博客.ZSmX~
(2)获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
mI3_B u$L!p4^\0  返回文件描述符标记(F_GETFD)
@6O g I*uL b\ ]k'q)M0(3)获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)IXPUB技术博客EVFA5U1VaX ~}
  返回文件状态标志(前面提到过,如O_RDONLY)
,vJ6Yn4r6^0(4)获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)IXPUB技术博客{$RYwxF
(5)获得/设置记录锁(cmd=F_GETLK、F_SETLK或F_SETLKW)
;HlC({*{!L#wI1JJ011.#include<unistd.h> #include<sys/ioctl.h> #include<stropts.h>IXPUB技术博客}sz o%@r!L
  int ioctl(int filedes, int request,…);//通用I/O操作IXPUB技术博客&FDA5c!bO:w3pr
  失败返回-1,成功返回其他值IXPUB技术博客,fMVm _5[&\
12.#include<sys/stat.h>IXPUB技术博客yO#Yt0V&y)E
  int stat(const char *restrict pathname, struct stat *restrict buf)IXPUB技术博客$U[4HO['I!eL
  //返回与此命名有关的信息结构IXPUB技术博客6x se)NW8q9Rm
  int fstat(int filedes, struct stat *buf);//获取已在filedes上打开的文件的有关信息
y~"J/u,Oswp0  int lstat(const char *restrict pathname, struct stat *restrict buf);//返回该符号链接的有关信息               三个函数的返回值:成功0失败-1
%?9rg$a2t n TmA0  struct stat{IXPUB技术博客Ds6_2Zfr
      mode_t   st_mode; //文件的类型和权限
5F6{.mg+Ms(Q*C0      ino_t   st_ino;//i节点号
J.E%HYar}0      dev_t   st_dev;//设备号IXPUB技术博客I_'l`DOhG0N'ka
      dev_t   st_rdev;//特殊文件的设备号
yjp)\ _^N0      nlink_t   st_nlink;//链接号IXPUB技术博客t/['{ Ix@8x|0[
      uid_t     st_uid;//拥有者的用户ID
$WX*y;]2eIQM7_0      gid_t     st_gid;//拥有者的组IDIXPUB技术博客V9{ jAi_+f&X
      off_t     st_size;//文件的大小IXPUB技术博客n$P5Q7vzV%~/g3Y+O[
      time_t     st_atime;//上次访问的时间IXPUB技术博客Y)kK3T Vy^n
      time_t     st_mtime;//上一次修改文件的时间IXPUB技术博客4aQ`3|3f2I8FG
      time_t     st_ctime;//上一个改变文件状态的时间IXPUB技术博客!e)D\(P M M
      blksize_t   st_blksize;//最优I/O块大小
1\,O&IsBU;~O4j$S0      blkcnt_t     st_blocks;//分配的硬盘块号码
1eCJcgh(d'L$x3}0  };  IXPUB技术博客2c[1E9T D7x
13.int access(const char *pathname, int mode);//测试文件的访问权限IXPUB技术博客F?A4Hb9h0q z
  成功返回0,失败返回-1;mode有如下几个选项:
UI%sh+tj_0    R_OK 测试读权限 W_OK测试写权限 X_OK测试执行权限 F_OK 测试文件是否存在
:QEH!o gr!ZWn014.#include <sys/stat.h> mode_t umask(mode_t cmask); //返回原来的屏蔽字
JI)D:_:J Q;L&k#j015.#include <sys/stat.h> int chmod(const char *pathname, mode_t mode);
~lAkF0  int fchmod(int filedes, mode_t mode);//更改文件的访问权限,成功返回0,失败返回-1IXPUB技术博客 hk ]APS,~.qz F
  mode的选项除了以上的9个权限之外,还有:S_ISUID 执行时设置用户ID   S_ISGID 执行时设置组ID   S_ISVTX 保存正本(粘住位) S_IRWXU 用户读写执行 S_IRWXG 组读写执行IXPUB技术博客 ^li j6bqFK
16.int chown(const char *pathname, uid_t owner, gid_t group);
t&e h[t |2q#?2i0  int fchown(int filedes, uid_t owner, gid_t group);IXPUB技术博客&ID\i _Q6V1uf/zx(o
  int lchown(const char *pathname ,uid_t owner, gid_t group);
k6ZQo-O']/e0  //更改文件的用户ID和组ID;成功返回0,失败返回-1IXPUB技术博客$hR&w,_^ i9U!u
17.int truncate(const char *pathname, off_t length);IXPUB技术博客+xO5Kg9n%Uz F
  int ftruncate(int filedes, off_t length);//截短文件 成功返回0出错返回-1IXPUB技术博客o4vZ;q;U'qsk
18.int link(const char *existingpath, const char *newpath);
(e{yTg?2q|8Pg0//在目录existingpath下创建新目录newpath,成功返回0失败返回-1
Ca"eepX/~Kv \019.#include<unistd.h>int unlink(const char *pathname)//删除目录,成功0失败返回-1
.gX\ q FP'D U,A020.#include <stdio.h>int remove(const char *pathname);//删除目录,成功返回0失败返回-1
d;t$X5m?&ai?'sCa m2H021.int rename(const char *oldname, const char *newname);//更改文件名,成功返回0失败-1IXPUB技术博客r![)W[)YQ,r1K8J n"V
22.#include<utime.h> int utime(const char *pathname, const struct utimbuf *times);
_lQg/AJ0  //更改文件的访问和修改时间;成功返回0,失败-1
q#] R K-o5]/aNN0  struct utimbuf {
g*AQ6x }{V\,h0    time_t actime; //访问时间IXPUB技术博客"L.m0Y U OM2wb1]o6E
    time_t modtime;//修改时间IXPUB技术博客 aO%j L2r;iG X
  }IXPUB技术博客 m,LD E\ Nw
23.#include <sys/stat.h> int mkdir(const char *pathname, mode_t mode);//创建文件(0/-1)IXPUB技术博客D/G\"qhC,xS6})]
24.int rmdir(const char *pathname);//删除文件 (0/-1)
zRrx3y4gvVS025.#include <unistd.h>int chdir(const char *pathname);
1O#jyi*T"W4O0  int fchdir(int filedes);//更改当前的工作目录 返回值:(0/-1)
x Qe l T5n\6K3a026.char *getcwd(char *buf, size_t size );//获取当前工作目录的绝对路径名 返回值(buf/NULL)IXPUB技术博客@J"r%F0d
            (十)标准I/O
Di!g?E)Enf2qN01.#include<stdio.h> #include <wchar.h>
}t0Np1ku)MA0int fwide(FILE *fp, int mode);//设置流定向(宽定向返回正/字节定向返回负/未定向返回0)IXPUB技术博客 tQJE6TB5d
mode参数值为负:试图使指定的流是字节定向的;正:宽定向;0不试图设置流的定向IXPUB技术博客 y?0t&C2i w(mBc
2.void setbuf(FILE *restrict fp, char *restrict buf);IXPUB技术博客lj-Y`!i,\EE
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);// 返回(0/-1)
e bOL*c:U0//更改缓冲类型(流被打开后也应该在对该流未执行任何操作时调用)IXPUB技术博客5`2A$s:li(@
mode 参数的选项:_IOFBF (全缓冲)   _IOLBF (行缓冲)_IONBF(不带缓冲,将忽略buf和size)IXPUB技术博客`t+`$B3CHN0G m
3.int fflush(FILE *fp);//冲洗流,将流中的数据传给内核,然后清空缓冲区。返回(0/EOF)
z9^j,^e!TD7~04.FILE *fopen(const char *restrict pathname, const char *restrict type);//打开指定的文件IXPUB技术博客[!C+ey d8_5e'n
FILE *freopen(const char *restrict pathname, const char *restrict type, FILE* restrict fp)IXPUB技术博客:n7QJ/E6x4o&F
  //在一个指定的流上打开文件,若流已打开则先关闭流,若已定向则清除定向。IXPUB技术博客2x2Q)n!ov'~&|H1V
FILE *fdopen(int filedes, const char *type);
u)W*N^kc-c0  //获取一个现有的文件描述符,并使一个标准的I/O流与该描述符相结合。IXPUB技术博客6IEQ}+K4s(b
  //成功返回文件指针,出错返回NULLIXPUB技术博客Z!Yv[M,kef2K
5.int fclose(FILE *fp);//关闭一个打开的流,返回(0/EOF)
;rF?A6Z;[06.int getc(FILE *fp);IXPUB技术博客:Mk5U,Y3Qg4jHG
int fgetc(FILE *fp);IXPUB技术博客9f"Y$?5e#m
int getchar(void); //读取一个字符;成功返回下一个字符,若已到文件结尾或出错返回EOF
%{:vP0Jn9^/o;S07.int ferror(FILE *fp);
YPaRc1_#{0int feof(FILE *fp);//测试文件是否出错和到达结尾;为真返回非0,否则返回0
scL!B*T AWV0void clearerr(FILE *fp);//清除错误和结束标志IXPUB技术博客 wP0kNl
8.int ungetc(int c, FILE *fp);//将字符压回流中;成功返回c,出错返回EOF
.a b }'C'fDK09.int putc(int c, FILE *fp);IXPUB技术博客7W9v-D(b"?`M UVH
int fputc(int c, FILE *fp);
Z.aN j:T4Hys0int putchar(int c);//输出函数,成功返回c,出错返回EOFIXPUB技术博客2H~1sr7k;P
10.char *fgets(char *restrict buf, int n, FILE *restrict fp);IXPUB技术博客qp"p V:]
  char *gets(char *buf);//每次输入一行;成功返回buf,出错或文件结尾则返回NULLIXPUB技术博客!_,Q(bhv`
11.int fputs(const char *restrict str, FILE *restrict fp);
RRr,^3F pU9Q?{ \0  int puts(const char *str);//输出一行的函数;成功返回非负值,出错则返回EOF
nwg6p$@3hpl012.size_t fread(void *restrict ptr, size_t size,size_t nobj,FILE *restrict fp);
'k9Y2waCA#lC tr0  size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
\ L'~a)Qo0  //二进制I/O操作,返回读或写的对象数(即nobj)
ic"Gs+c^bc013.long ftell(FILE *fp);//返回当前的文件位置指示;成功返回当前文件位置指示,失败-1L
+P1OwV1|5B*|0  int fseek(FILE *fp, long offset, int whence);//为打开的文件设置新的偏移量(0/非0)IXPUB技术博客(kZH*YW
  void rewind(FILE *fp);//将一个流设置到文件的起始位置IXPUB技术博客c1o s0x+r/\l[
14.off_t ftello(FILE *fp);//成功返回当前文件的位置指示(与上就差返回类型),失败返回-1IXPUB技术博客l i&kahok3q
  int fseeko(FILE *fp, off_t offset, int whence);//成功返回0,失败返回非0
4d#RP ]nkdu015.int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
Gz%^9J1Yg9t%}{k S0//将文件位置指示器的当前值存入指向的对象中
'~#KDXK0  int fsetpos(FILE *fp, const fpos_t *pos);//用pos的值将流重新定位到该位置;成功0失败非0;
W2E b/M%V{"V016.int printf(const char *restrict format,...);
]A0Vk0n6s%]m\`0  int fprintf(FILE *restrict fp, const char *restrict format,…);//成功返回输出字符数/负值IXPUB技术博客"u&[-}m5aC1O2r1p
  int sprintf(char *restrict buf, const char *restrict format,…);
,Mu4j;O\-t D aJ:?0  int snprintf(char *restrict buf, size_t n, const char *restrict format,…);
'_1?$Q\"n/D:T}x0  //成功返回存入数组的字符数,出错则返回负值IXPUB技术博客dY#Na5v T/N
17.scanf(const char *restrict format, …);
8|+GH{%bS%i~0  int fscanf(FILE *restrict fp, const char *restrict format,…);
rH-~ _\w U'u:R0  int sscanf(const char *restrict buf, const char *restrict format, …);IXPUB技术博客%n9Y?^yl:`%H6J
  //返回指定的输入项数;若输入出错或在任意变换前已到达文件结尾则返回EOF
/]/Y:ec8q018.int fileno(FILE *fp);//获取文件描述符;返回该流相关联的文件描述符IXPUB技术博客/A+^-o;S)~i
19.char *tmpnam(char *ptr);//创建临时文件   //返回指向唯一路径的指针IXPUB技术博客"G(| F G.@-Mt xg
  FILE *tmpfile(void); //若成功则返回文件指针,若出错则返回NULL
B)zr7];a2\|;t020.char *tempnam(const char *directory, const char *prefix);//指定目录和前缀创建临时文件
IIt0M&_x021.int mkstemp(char *template)//指定临时文件的名字创建;成功返回文件描述符,出错返回-1IXPUB技术博客L4M?#z e.]-u
        (十一)系统数据文件和信息IXPUB技术博客Z,hoWb
1.include<pwd.h> struct passwd *getpwuid(uid_t uid);IXPUB技术博客'i3vHpAE nS
struct passwd *getpwnam(const char *name);//获取口令文件返回passwd结构,出错返NULL
l jw#|%rXK0struct passwd {
k;^:Px M4w8txM9o0  char *pw_name; //用户名IXPUB技术博客nDypy
  char *pw_passwd; //加密口令IXPUB技术博客#YZ)g]:p)^2vI
  uid_t blog_uid; //数值用户ID
;O'g!Ik*Wa-`0  gid_t blog_gid;   //数值组ID
4LWt}aHOWw.U0g0  char *pw_gecos; //注释字段IXPUB技术博客%^4WW)Z-w
  char *pw_dir; //出始工作目录IXPUB技术博客0c4j-q.`$S
  char *pw_shell;//初始shell(用户程序)IXPUB技术博客x#Z0UYP`C
};IXPUB技术博客7S3x0p fS+UzG
2.struct passwd *getpwent(void);//返回口令文件(/etc/passwd)中的下一项记录,调用用一定要使用endpwent()来关闭; 出错或者到达文件结尾则返回NULL
["a pg%H0void setpwent(void);//打开文件(未打开时)然后反绕它所使用的文件(定位到开始处)
Q/S s5C9@hA0void endpwent(void);//关闭使用的文件IXPUB技术博客Z`R+?&N W!WfA
3.#include <shadow.h>   /etc/shadow
ah'k3l;ez5H(Gm0  struct spwd *getspnam(const char *name);//获取阴影口令文件返回spwd结构
'zf:Nl;Aw'M0  struct spwd *getspent(void);//获取阴影口令文件中的下一项并返回spwd结构;出错返回NULL
:FD H.R~NV#y0  void setspent(void); //打开文件(未打开时)然后反绕文件
+V!vdi~_J&o3Y0  void endspent(void);//关闭文件IXPUB技术博客5Sc4rV5TX:cu,S/L
  struct spwd {
ZV3_:XF`0    char *sp_namp; //用户登录名
4ZI@4gB5Fo \0    char *sp_pwdp;//加密口令
@,\7^{ m5K[b]9C U0    int sp_lstchg; //上次更改口令以来经过的时间IXPUB技术博客b$OZi*R,gD/S'w
    int sp_max; //经过多少天后允许被修改IXPUB技术博客GNE xA%h$Tz
    int sp_warn; //到期警告天数IXPUB技术博客'Y4hRJ#]g,^5w
    int sp_inact; //帐户不活动之前剩余天数
%AC'E&H%D)v#]b'}3W)X0    int sp_expire; //帐户到期天数
1NI{y[%R-Z0    unsigned int sp_flag;//保留字
4NE?*` t [#q?0  }
/lu&o@l6C~04.#include <grp.h> struct group *getgrgid(gid_t gid);//根据组ID返回相应的group结构IXPUB技术博客4x,x IZd
struct gourp *getgrnam(const char *name);根据组名获取组结构IXPUB技术博客3o?}(cy"w
//成功返回相对应的组结构,出错返回NULL
nZ&d2En eaH0struct group {
Y0t4Wl9Z0  char *gr_name;//组名
^!Kl"Y7C%F8V1Yb0  char *gr_passwd;//加密口令IXPUB技术博客/dRvOi:I/Cm
  int gr_gid;//组ID
N$VI/n$v f0  char **gr_mem;//指向各用户名的指针的数组IXPUB技术博客.LNEI+a.QM7w5^3B}s
};IXPUB技术博客*jHyv JeC3Y5}p
5.struct group *getgrent(void);//返回/etc/group文件中的下一项并返回指针返回NULL
&i4W#T Mw7u0void setgrent(void);// 打开文件(未打开时)然后反绕文件
n%Def$pP|1w9X v0void endgrent(void);//关闭文件IXPUB技术博客-v6CZ~ s
6.int uname(struct utsname *name);
E ` h'[ E Y7@1\ya0//返回与当前主机和操作系统有关的信息,成功返回非负,出错返回-1IXPUB技术博客,l.`"Nz!O
struct utsname {
@)]1H3D!V%j^!h5t[ j0char sysname[]; //操作系统名IXPUB技术博客Zy(p`3vYf2S f]
char nodename[]; //节点名IXPUB技术博客xT_#|2qNG8rU ybi
char release[]; //当前操作系统的版本
lS G!G:Rz"V%q9R0char version[]; //这个版本的序号IXPUB技术博客0ec,soE(M,Z
char machine[]; //主机名IXPUB技术博客%e]+yh%P$Exq1r
}
+@Z*B'JN4~ P07.int gethostname(char *name, int namlen);//获取主机名给name,成功返回0失败返回-1IXPUB技术博客{#SC _ [Z)h;O
8.#include<time.h> time_t time(time_t *calptr);//返回当前的时间和日期并存于calptr,出错-1
/\2iW ^t].G$_t09.#include<sys/time.h>int gettimeofday(struct timeval *restrict tp, void *restrict tzp);IXPUB技术博客n$v;Dc;g
//获取精确到微秒的时间并存于tp中,返回值:总是0, tzp的唯一合法值是NULL
;ii+j [n2hY%e0struct tmeval {
,f u$[M-c$xND0  time_t tv_sec; //秒
)sE}k;] vbc0  long tv_usec ;//微秒
;MKX0RR}x0}
)s }0y(j2pF010. struct tm *gmtime(const time_t *calptr);//将日历时间转成国际标准时间的年月日时分秒周日
~H)r"s:Y[^q)N0  struct tm *localtime(const time_t *calptr);// 将日历时间转换成本地时间(考虑到本地时间和夏时指标志)返回指向tm结构的指针
-[S@"@G1N cA0  struct tm {
0Q%N%r`}0LQ`k%[0    int tm_sec; //秒数 [0-60] 60可以表示润秒
)y9E~p)Lt0    int tm_min; //分钟 [0-59]IXPUB技术博客.b E:@)b!B(w Ec
    int tm_hour; //小时 [0-23]IXPUB技术博客YaL1D8r,^qa
    int tm_mday; //日 [1-31]IXPUB技术博客PuTj5I-M4Y&Ip
    int tm_mon; //月 [0-11]
NL*D{}6a Q#X k"v:w2mcj0    int tm_year;//年 [1900-]
)M2y*I1n!t C7t$l0    int tm_wday; //星期 [0-6]IXPUB技术博客6NLv8d'X"u(si;Y
    int tm_yady;//一年的第几天 [0-365]IXPUB技术博客'tC)i$F6ll
    int tm_sidst; //是否为夏时制IXPUB技术博客.mb/?"`3w
  };
W9@1l"l]|z\0l*@011.time_t mktime(struct tm *tmptr);//以本地时间的信息转化成time_t的值,返回:日历时间/-1IXPUB技术博客'~u)sqSM
12.char *asctime(const struct tm *tmptr);IXPUB技术博客$P'QmbaMr _
  char *ctime(const time_t *calptr);
M.O%u}`/[0  //将各自的时间参数转化成如”Tue Feb 10 18:20:15 2007\n\0”的格式IXPUB技术博客/DlR1?9wwae
13.size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);//将时间tmptr以指定的format格式存于buf中,返回存入的字符数/失败0
%e:x Td+Ei0  format中可以用以下符号表示要输出的格式:IXPUB技术博客1Ya)a/c1wH&y
  %a 缩写的周日名 Tue               %A 全周日名     TuesdayIXPUB技术博客\$k]$Y6r?7u;dR#i
  %b 缩写的月名   Feb               %B 全月名       FebruaryIXPUB技术博客 _T+eu.M Z$_
  %c 日期和时间 Tue Feb 10 13:02:15 2007 %C 年/100 [0-99]   7
_[*xKH+_6\&G0  %d 月日[0-31] 10                 %D 日期[MM/DD/YY] 07/02/10
\&^ |dae"]0  %e 月日[1-31](一位数字加空格) 2       %F [YYYY-MM-DD] 2007-02-10
_bQ8j'P*[ Q]!C [1w0  %g 基于周的年的最后两位数   07       %G 基于周的年     2007IXPUB技术博客-y\7[p'p(TQziE/K
  %h 与%b相同                     %H 小时(24小时制):[00-23]
S*V%t7w3N4E~YV A0  %I 小时(12小时制)[01-12]           %j   年日[001-366]IXPUB技术博客R8o3C)C(E#k4?
  %m 月[01-12]                     %M 分[00-59]IXPUB技术博客.NT!F [2~z-M ~5n+N-u
  %n 换行符                       %p AM/PM       PMIXPUB技术博客,UD1`RPS"v;nMq8I
  %r 本地时间(12小时) 06:27:38 PM     %R 与%H:%M相同 18:27
aw5cf~"C+J0  %S 秒[00-60]                     %t 水平制表符
6Z4^/?y x7@(s0  %T 与“%H:%M:%S” 18:27:38     %u 周日[1-7]
&}/_;GcEGk0  %U 星期日周数[00-53]                 %V 周数[01-53]IXPUB技术博客3b2r|A]_@:RV7y
  %w 周日[0-6]                     %W 星期一周数IXPUB技术博客2a0b k4s)Y3s,B'tA%P h6u
  %x 日期                         %X 时间
]D$F6~ pYx f0  %y 年的最后两位数     07             %Y 年     2007
-H0e m5e&P T^0  %z UTC偏移量   -0500             %Z 时区名 EST
+]B#P6k.z)@-|1L0  %% 转换一个%     %
? oTf(`{0            (十二)信号IXPUB技术博客j'R0]V m z Bs,S_
1.UNIX信号表 []内为默认处理动作 core表示动作的同时产生core jump,并生成一个core文件:IXPUB技术博客q/H~k'q+Dl]kQ
SIGABRT     由调用abort函数产生,进程非正常退出       [终止+core]IXPUB技术博客yN9Y8j%ZQ-_ e` E
SIGALRM     用alarm函数设置的timer超时或setitimer函数设置的interval timer超时[终止]IXPUB技术博客#Dg%|1Qm$f}
SIGBUS     某种特定的硬件异常,通常由内存访问引起         [终止+core]
(tU I7umF.hl0SIGCANCEL     由Solaris Thread Library内部使用,通常不会使用       [忽略]IXPUB技术博客 y1D$TI6o6_tF(H{
SIGCHLD   &

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: