歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

《UNIX網絡編程》例子程序中所使用的包裹函數及部分常量

《UNIX網絡編程套接字聯網API》這本書的示例中定義了許多包裹函數,它們的名稱和標准函數一樣,只是首字母變成大寫字母;每個包裹函數完成實際的函數調用,檢查返回值,並在發生錯誤時終止程序。

我在重寫書上例子的時候,也仿照書上的方式,定義了許多包裹函數,提高程序的可讀性(當然,我定義的包裹函數的錯誤處理沒有書上例子這麼詳細了)

 《Unix網絡編程》PDF版下載地址:http://www.linuxidc.com/Linux/2013-01/77936.htm

文件my_unp.h:它定義了一些常量,聲明了所有的包裹函數

#ifndef MY_UNP_H_ 
#define MY_UNP_H_ 

#include <stdio.h> 
#include <stdarg.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

#include <unistd.h> 
#include <errno.h> 
#include <pthread.h>
#include <semaphore.h>
#include <sys/socket.h> 
#include <sys/wait.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/select.h> 
#include <sys/epoll.h> 
#include <sys/poll.h> 
#include <sys/file.h> 
#include <sys/mman.h>

#define MAXLINE 1024 
#define LISTENQ 1024 

#define MAXNITEMS 1000000
#define MAXNTHREADS 100

#define SERV_PORT 9877 
#define SERV_PORT_STR "9877" 

#define SA struct sockaddr 
typedef void Sigfunc(int); 

#define min(a,b)    ((a) < (b) ? (a) : (b)) 
#define max(a,b)    ((a) > (b) ? (a) : (b)) 


//錯誤處理函數,輸出錯誤信息後退出程序 
void error_quit(char *fmt, ...); 

//為了適應網絡的慢速IO而編寫的讀寫函數
ssize_t readn(int fd, void *vptr, size_t n); 
ssize_t writen(int fd, const void *vptr, size_t n); 
ssize_t readline(int fd, void *vptr, size_t maxlen); 

//各類讀寫包裹函數 
void Write(int fd, void *ptr, size_t nbytes); 
ssize_t Read(int fd, void *ptr, size_t nbytes); 
ssize_t Readn(int fd, void *ptr, size_t nbytes); 
void Writen(int fd, void *ptr, size_t nbytes); 
ssize_t Readline(int fd, void *ptr, size_t maxlen); 
void Fputs(const char *ptr, FILE *stream); 
char *Fgets(char *ptr, int n, FILE *stream); 

//各類標准包裹函數 
int Open(const char *pathname, int flags, mode_t mode);
void Close(int fd);
Sigfunc *Signal(int signo, Sigfunc *func); 
void *Malloc(size_t size); 
void *Calloc(size_t n, size_t size);
void Pipe(int *fds); 
pid_t Fork(void); 
pid_t Waitpid(pid_t pid, int *iptr, int options);
void Dup2(int fd1, int fd2);

//各類網絡包裹函數 
int Socket(int family, int type, int protocol); 
void Inet_pton(int family, const char *strptr, void *addrptr); 
void Connect(int fd, const struct sockaddr *sa, socklen_t salen); 
void Listen(int fd, int backlog); 
void Bind(int fd, const struct sockaddr *sa, socklen_t salen); 
int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr); 
const char *Inet_ntop(int family, const void *addrptr, char *strptr, size_t len); 
int Select(int nfds, fd_set *readfds, fd_set *writefds, 
    fd_set *exceptfds, struct timeval *timeout); 
int Poll(struct pollfd *fdarray, unsigned long nfds, int timeout); 
void Shutdown(int fd, int how); 
int Epoll_create(int size); 
void Epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 
int Epoll_wait(int epfd, struct epoll_event *events, 
      int maxevents, int timeout); 
void Sendto(int fd, const void *ptr, size_t nbytes, int flags, 
   const struct sockaddr *sa, socklen_t salen); 
ssize_t Recvfrom(int fd, void *ptr, size_t nbytes, int flags,
    struct sockaddr *sa, socklen_t *salenptr); 
void Setsockopt(int fd, int level, int optname,
    const void *optval, socklen_t optlen);
void *Mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
void Munmap(void *addr, size_t len);
void Ftruncate(int fd, off_t length);

//各類和線程操作相關的包裹函數 
void Pthread_create(pthread_t *tid, const pthread_attr_t *attr,
     void * (*func)(void *), void *arg);
void Pthread_detach(pthread_t tid);
void Pthread_join(pthread_t tid, void **status);
void Pthread_kill(pthread_t tid, int signo);
void Pthread_mutex_lock(pthread_mutex_t *mptr);
void Pthread_mutex_unlock(pthread_mutex_t *mptr);
//此函數相當於UNP書上的set_concurrency函數
void Pthread_setconcurrency(int level);
void Pthread_cond_signal(pthread_cond_t *cptr);
void Pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);

//各類和信號量相關的包裹函數
sem_t *Sem_open(const char *name, int oflag,
    mode_t mode, unsigned int value);
void Sem_close(sem_t *sem);
void Sem_unlink(const char *pathname);
void Sem_init(sem_t *sem, int pshared, unsigned int value);
void Sem_destroy(sem_t *sem);
void Sem_wait(sem_t *sem);
void Sem_post(sem_t *sem);
void Sem_getvalue(sem_t *sem, int *valp);

#endif 

Copyright © Linux教程網 All Rights Reserved