Linux C 函式速查
阿新 • • 發佈:2018-11-21
...abs
abs(計算整型數的絕對值)
相關函式 labs, fabs
表頭檔案 #include<stdlib.h>
定義函式 int abs (int j)
函式說明 abs()用來計算引數j的絕對值,然後將結果返回。
返回值 返回引數j的絕對值結果。
Linhan 2005 ShenZhen
範例:
#ingclude <stdlib.h>
main(){
int ansert;
answer = abs(-12);
printf("|-12| = %d\n", answer);
}
執行 |-12| = 12
...acos
acos(取反餘弦函式數值)
相關函式 asin , atan , atan2 , cos , sin , tan
表頭檔案 #include <math.h>
定義函式 double acos (double x);
函式說明 acos()用來計算引數x的反餘弦值,然後將結果返回。引數x範圍為-1至1之間,超過此範圍則會失敗。
返回值 返回0至PI之間的計算結果,單位為弧度,在函式庫中角度均以弧度來表示。
錯誤程式碼 EDOM引數x超出範圍。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include <math.h>
main (){
double angle;
angle = acos(0.5);
printf("angle = %f\n", angle);
}
執行 angle = 1.047198
...asin
asin(取反正弦函式值)
相關函式 acos , atan , atan2 , cos , sin , tan
表頭檔案 #include <math.h>
定義函式 double asin (double x)
函式說明 asin()用來計算引數x的反正弦值,然後將結果返回。引數x範圍為-1至1之間,超過此範圍則會失敗。
返回值 返回-PI/2之PI/2之間的計算結果。
錯誤程式碼 EDOM引數x超出範圍
附加說明 使用GCC編譯時請加入-lm
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double angle;
angle = asin (0.5);
printf("angle = %f\n",angle);
}
執行 angle = 0.523599
...atan
atan(取反正切函式值)
相關函式 acos,asin,atan2,cos,sin,tan
表頭檔案 #include<math.h>
定義函式 double atan(double x);
函式說明 atan()用來計算引數x的反正切值,然後將結果返回。
返回值 返回-PI/2至PI/2之間的計算結果。
附加說明 使用GCC編譯時請加入-lm
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double angle;
angle =atan(1);
printf("angle = %f\n",angle);
}
執行 angle = 1.570796
...atan2
atan2(取得反正切函式值)
相關函式 acos,asin,atan,cos,sin,tan
表頭檔案 #include<math.h>
定義函式 double atan2(double y,double x);
函式說明 atan2()用來計算引數y/x的反正切值,然後將結果返回。
返回值 返回-PI/2 至PI/2 之間的計算結果。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double angle;
angle = atan2(1,2);
printf("angle = %f\n", angle);
}
執行 angle = 0.463648
...ceil
ceil(取不小於引數的最小整型數)
相關函式 fabs
表頭檔案 #include <math.h>
定義函式 double ceil (double x);
函式說明 ceil()會返回不小於引數x的最小整數值,結果以double形態返回。
返回值 返回不小於引數x的最小整數值。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double value[ ]={4.8,1.12,-2.2,0};
int i;
for (i=0;value[i]!=0;i++)
printf("%f=>%f\n",value[i],ceil(value[i]));
}
執行 4.800000=>5.000000
1.120000=>2.000000
-2.200000=>-2.000000
...cos
cos(取餘玄函式值)
相關函式 acos,asin,atan,atan2,sin,tan
表頭檔案 #include<math.h>
定義函式 double cos(double x);
函式說明 cos()用來計算引數x 的餘玄值,然後將結果返回。
返回值 返回-1至1之間的計算結果。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer = cos(0.5);
printf("cos (0.5) = %f\n",answer);
}
執行 cos(0.5) = 0.877583
...cosh
cosh(取雙曲線餘玄函式值)
相關函式 sinh,tanh
表頭檔案 #include<math.h>
定義函式 double cosh(double x);
函式說明 cosh()用來計算引數x的雙曲線餘玄值,然後將結果返回。數學定義
式為:(exp(x)+exp(-x))/2。
返回值 返回引數x的雙曲線餘玄值。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer = cosh(0.5);
printf("cosh(0.5) = %f\n",answer);
}
執行 cosh(0.5) = 1.127626
...exp
exp(計算指數)
相關函式 log,log10,pow
表頭檔案 #include<math.h>
定義函式 double exp(double x);
函式說明 exp()用來計算以e為底的x次方值,即ex值,然後將結果返回。
返回值 返回e的x次方計算結果。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer;
answer = exp (10);
printf("e^10 =%f\n", answer);
}
執行 e^10 = 22026.465795
...frexp
frexp(將浮點型數分為底數與指數)
相關函式 ldexp,modf
表頭檔案 #include<math.h>
定義函式 double frexp( double x, int *exp);
函式說明 frexp()用來將引數x 的浮點型數切割成底數和指數。底數部分直接
返回,指數部分則借引數exp 指標返回,將返回值乘以2 的exp次方
即為x的值。
返回值 返回引數x的底數部分,指數部分則存於exp指標所指的地址。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include <math.h>
main()
{
int exp;
double fraction;
fraction = frexp (1024,&exp);
printf("exp = %d\n",exp);
printf("fraction = %f\n", fraction);
}
執行 exp = 11
fraction = 0.500000 /* 0.5*(2^11)=1024*/
...ldexp
ldexp(計算2的次方值)
相關函式 frexp
表頭檔案 #include<math.h>
定義函式 double ldexp(double x,int exp);
函式說明 ldexp()用來將引數x乘上2的exp次方值,即x*2exp。
返回值 返回計算結果。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
/* 計算3*(2^2)=12 */
#include<math.h>
main()
{
int exp;
double x,answer;
answer = ldexp(3,2);
printf("3*2^(2) = %f\n",answer);
}
執行 3*2^(2) = 12.000000
...log
log(計算以e 為底的對數值)
相關函式 exp,log10,pow
表頭檔案 #include <math.h>
定義函式 double log (double x);
函式說明 log()用來計算以e為底的x 對數值,然後將結果返回。
返回值 返回引數x的自然對數值。
錯誤程式碼 EDOM 引數x為負數,ERANGE 引數x為零值,零的對數值無定義。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer;
answer = log (100);
printf("log(100) = %f\n",answer);
}
執行 log(100) = 4.605170
...log10
log10(計算以10 為底的對數值)
相關函式 exp,log,pow
表頭檔案 #include<math.h>
定義函式 double log10(double x);
函式說明 log10()用來計算以10為底的x對數值,然後將結果返回。
返回值 返回引數x以10為底的對數值。
錯誤程式碼 EDOM引數x為負數。RANGE引數x為零值,零的對數值無定義。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer;
answer = log10(100);
printf("log10(100) = %f\n",answer);
}
執行 log10(100) = 2.000000
...pow
pow(計算次方值)
相關函式 exp,log,log10
表頭檔案 #include<math.h>
定義函式 double pow(double x,double y);
函式說明 pow()用來計算以x為底的y次方值,即xy值,然後將結果返回。
返回值 返回x的y次方計算結果。
錯誤程式碼 EDOM 引數x為負數且引數y不是整數。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include <math.h>
main()
{
double answer;
answer =pow(2,10);
printf("2^10 = %f\n", answer);
}
執行 2^10 = 1024.000000
...sin
sin(取正玄函式值)
相關函式 acos,asin,atan,atan2,cos,tan
表頭檔案 #include<math.h>
定義函式 double sin(double x);
函式說明 sin()用來計算引數x的正玄值,然後將結果返回。
返回值 返回-1 至1之間的計算結果。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer = sin (0.5);
printf("sin(0.5) = %f\n",answer);
}
執行 sin(0.5) = 0.479426
...sinh
sinh(取雙曲線正玄函式值)
相關函式 cosh,tanh
表頭檔案 #include<math.h>
定義函式 double sinh( double x);
函式說明 sinh()用來計算引數x的雙曲線正玄值,然後將結果返回。數學定義
式為:(exp(x)-exp(-x))/2。
返回值 返回引數x的雙曲線正玄值。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer = sinh (0.5);
printf("sinh(0.5) = %f\n",answer);
}
執行 sinh(0.5) = 0.521095
...sqrt
sqrt(計算平方根值)
相關函式 hypotq
表頭檔案 #include<math.h>
定義函式 double sqrt(double x);
函式說明 sqrt()用來計算引數x的平方根,然後將結果返回。引數x必須為正
數。
返回值 返回引數x的平方根值。
錯誤程式碼 EDOM 引數x為負數。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
/* 計算200的平方根值*/
#include<math.h>
main()
{
double root;
root = sqrt (200);
printf("answer is %f\n",root);
}
執行 answer is 14.142136
...tan
tan(取正切函式值)
相關函式 atan,atan2,cos,sin
表頭檔案 #include <math.h>
定義函式 double tan(double x);
函式說明 tan()用來計算引數x的正切值,然後將結果返回。
返回值 返回引數x的正切值。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer = tan(0.5);
printf("tan (0.5) = %f\n",answer);
}
執行 tan(0.5) = 0.546302
...tanh
tanh(取雙曲線正切函式值)
相關函式 cosh,sinh
表頭檔案 #include<math.h>
定義函式 double tanh(double x);
函式說明 tanh()用來計算引數x的雙曲線正切值,然後將結果返回。數學定義
式為:sinh(x)/cosh(x)。
返回值 返回引數x的雙曲線正切值。
附加說明 使用GCC編譯時請加入-lm。
Linhan 2005 ShenZhen
範例:
#include<math.h>
main()
{
double answer = tanh(0.5);
printf("tanh(0.5) = %f\n",answer);
}
執行 tanh(0.5) = 0.462117
...getenv
getenv(取得環境變數內容)
相關函式 putenv,setenv,unsetenv
表頭檔案 #include<stdlib.h>
定義函式 char * getenv(const char *name);
函式說明 getenv()用來取得引數name環境變數的內容。引數name為環境變數
的名稱,如果該變數存在則會返回指向該內容的指標。環境變數的
格式為name=value。
返回值 執行成功則返回指向該內容的指標,找不到符合的環境變數名稱則
返回NULL。
Linhan 2005 ShenZhen
範例:
#include<stdlib.h>
mian()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER=%s\n”,p);
}
執行 USER = root
...putenv
putenv(改變或增加環境變數)
相關函式 getenv,setenv,unsetenv
表頭檔案 #include4<stdlib.h>
定義函式 int putenv(const char * string);
函式說明 putenv()用來改變或增加環境變數的內容。引數string的格式為
name=value,如果該環境變數原先存在,則變數內容會依引數
string改變,否則此引數內容會成為新的環境變數。
返回值 執行成功則返回0,有錯誤發生則返回-1。
錯誤程式碼 ENOMEM 記憶體不足,無法配置新的環境變數空間。
Linhan 2005 ShenZhen
範例:
#include<stdlib.h>
main()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER =%s\n”,p);
putenv(“USER=test”);
printf(“USER+5s\n”,getenv(“USER”));
}
執行 USER=root
USER=root
...setenv
setenv(改變或增加環境變數)
相關函式 getenv,putenv,unsetenv
表頭檔案 #include<stdlib.h>
定義函式 int setenv(const char *name,const char * value,int
overwrite);
函式說明 setenv()用來改變或增加環境變數的內容。引數name為環境變數名
稱字串。
引數 value則為變數內容,引數overwrite用來決定是否要改變已存在的
環境變數。如果overwrite不為0,而該環境變數原已有內容,則原
內容會被改為引數value所指的變數內容。如果overwrite為0,且該
環境變數已有內容,則引數value會被忽略。
返回值 執行成功則返回0,有錯誤發生時返回-1。
錯誤程式碼 ENOMEM 記憶體不足,無法配置新的環境變數空間
Linhan 2005 ShenZhen
範例:
#include<stdlib.h>
main()
{
char * p;
if((p=getenv(“USER”)))
printf(“USER =%s\n”,p);
setenv(“USER”,”test”,1);
printf(“USER=%s\n”,getenv(“USEr”));
unsetenv(“USER”);
printf(“USER=%s\n”,getenv(“USER”));
}
執行 USER = root
USER = test
USER = (null)
...accept
accept(接受socket連線)
相關函式 socket,bind,listen,connect
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int accept(int s,struct sockaddr * addr,int * addrlen);
函式說明 accept()用來接受引數s的socket連線。引數s的socket必需先經bind()、listen()函式處理過,當有連線進來時accept()會返回一個新的socket處理程式碼,往後的資料傳送與讀取就是經由新的socket處理,而原來引數s的socket能繼續使用accept()來接受新的連線要求。連線成功時,引數addr所指的結構會被系統填入遠端主
機的地址資料,引數addrlen為scokaddr的結構長度。關於結構
sockaddr的定義請參考bind()。
返回值 成功則返回新的socket處理程式碼,失敗返回-1,錯誤原因存於errno中。
錯誤程式碼 EBADF 引數s 非合法socket處理程式碼。
EFAULT 引數addr指標指向無法存取的記憶體空間。
ENOTSOCK 引數s為一檔案描述詞,非socket。
EOPNOTSUPP 指定的socket並非SOCK_STREAM。
EPERM 防火牆拒絕此連線。
ENOBUFS 系統的緩衝記憶體不足。
ENOMEM 核心記憶體不足。
Linhan 2005 ShenZhen
範例:
參考listen()。
...bind
bind(對socket定位)
相關函式 socket,accept,connect,listen
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int bind(int sockfd,struct sockaddr * my_addr,int addrlen);
函式說明 bind()用來設定給引數sockfd的socket一個名稱。此名稱由引數my_addr指向一sockaddr結構,對於不同的socket
domain定義了一個通用的資料結構
struct sockaddr
{
unsigned short int sa_family;
char sa_data[14];
};
sa_family 為呼叫socket()時的domain引數,即AF_xxxx值。
sa_data 最多使用14個字元長度。
此sockaddr結構會因使用不同的socket domain而有不同結構定義,
例如使用AF_INET domain,其socketaddr結構定義便為
struct socketaddr_in
{
unsigned short int sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
struct in_addr
{
uint32_t s_addr;
};
sin_family 即為sa_family
sin_port 為使用的port編號
sin_addr.s_addr 為IP 地址
sin_zero 未使用。
引數 addrlen為sockaddr的結構長度。
返回值 成功則返回0,失敗返回-1,錯誤原因存於errno中。
錯誤程式碼 EBADF 引數sockfd 非合法socket處理程式碼。
EACCESS 許可權不足
ENOTSOCK 引數sockfd為一檔案描述詞,非socket。
Linhan 2005 ShenZhen
範例:
參考listen()
...connect
connect(建立socket連線)
相關函式 socket,bind,listen
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
函式說明 connect()用來將引數sockfd 的socket 連至引數serv_addr 指定的網路地址。結構sockaddr請參考bind()。引數addrlen為sockaddr的結構長度。
返回值 成功則返回0,失敗返回-1,錯誤原因存於errno中。
錯誤程式碼 EBADF 引數sockfd 非合法socket處理程式碼
EFAULT 引數serv_addr指標指向無法存取的記憶體空間
ENOTSOCK 引數sockfd為一檔案描述詞,非socket。
EISCONN 引數sockfd的socket已是連線狀態
ECONNREFUSED 連線要求被server端拒絕。
ETIMEDOUT 企圖連線的操作超過限定時間仍未有響應。
ENETUNREACH 無法傳送資料包至指定的主機。
EAFNOSUPPORT sockaddr結構的sa_family不正確。
EALREADY socket為不可阻斷且先前的連線操作還未完成。
Linhan 2005 ShenZhen
範例:
/* 利用socket的TCP client
此程式會連線TCP server,並將鍵盤輸入的字串傳送給server。
TCP server範例請參考listen()。
*/
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 1234
#define SERVER_IP “127.0.0.1”
main()
{
int s;
struct sockaddr_in addr;
char buffer[256];
if((s = socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}
/* 填寫sockaddr_in結構*/
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
/* 嘗試連線*/
if(connect(s,&addr,sizeof(addr))<0){
perror(“connect”);
exit(1);
}
/* 接收由server端傳來的資訊*/
recv(s,buffer,sizeof(buffer),0);
printf(“%s\n”,buffer);
while(1){
bzero(buffer,sizeof(buffer));
/* 從標準輸入裝置取得字串*/
read(STDIN_FILENO,buffer,sizeof(buffer));
/* 將字串傳給server端*/
if(send(s,buffer,sizeof(buffer),0)<0){
perror(“send”);
exit(1);
}
}
}
執行 $ ./connect
Welcome to server!
hi I am client! /*鍵盤輸入*/
/*<Ctrl+C>中斷程式*/
...endprotoent
endprotoent(結束網路協議資料的讀取)
相關函式 getprotoent,getprotobyname,getprotobynumber,setprotoent
表頭檔案 #include<netdb.h>
定義函式 void endprotoent(void);
函式說明 endprotoent()用來關閉由getprotoent()開啟的檔案。
返回值
Linhan 2005 ShenZhen
範例:
參考getprotoent()
...endservent
endservent(結束網路服務資料的讀取)
相關函式 getservent,getservbyname,getservbyport,setservent
表頭檔案 #include<netdb.h>
定義函式 void endservent(void);
函式說明 endservent()用來關閉由getservent()所開啟的檔案。
返回值
Linhan 2005 ShenZhen
範例:
參考getservent()。
...getsockopt
getsockopt(取得socket狀態)
相關函式 setsockopt
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int getsockopt(int s,int level,int optname,void*
optval,socklen_t* optlen);
函式說明 getsockopt()會將引數s所指定的socket狀態返回。引數optname代表欲取得何種選項狀態,而引數optval則指向欲儲存結果的記憶體地址,引數optlen則為該空間的大小。引數level、optname請參考setsockopt()。
返回值 成功則返回0,若有錯誤則返回-1,錯誤原因存於errno
錯誤程式碼 EBADF 引數s 並非合法的socket處理程式碼
ENOTSOCK 引數s為一檔案描述詞,非socket
ENOPROTOOPT 引數optname指定的選項不正確
EFAULT 引數optval指標指向無法存取的記憶體空間
Linhan 2005 ShenZhen
範例:
#include<sys/types.h>
#include<sys/socket.h>
main()
{
int s,optval,optlen = sizeof(int);
if((s = socket(AF_INET,SOCK_STREAM,0))<0) perror
(“socket”);
getsockopt(s,SOL_SOCKET,SO_TYPE,&optval,&optlen);
printf(“optval = %d\n”,optval);
close(s);}
執行 optval = 1 /*SOCK_STREAM的定義正是此值*/
...htonl
htonl(將32位主機字元順序轉換成網路字元順序)
相關函式 htons,ntohl,ntohs
表頭檔案 #include<netinet/in.h>
定義函式 unsigned long int htonl(unsigned long int hostlong);
函式說明 htonl()用來將引數指定的32位hostlong 轉換成網路字元順序。
返回值 返回對應的網路字元順序。
Linhan 2005 ShenZhen
範例:
參考getservbyport()或connect()。
...htons
htons(將16位主機字元順序轉換成網路字元順序)
相關函式 htonl,ntohl,ntohs
表頭檔案 #include<netinet/in.h>
定義函式 unsigned short int htons(unsigned short int hostshort);
函式說明 htons()用來將引數指定的16位hostshort轉換成網路字元順序。
返回值 返回對應的網路字元順序。
Linhan 2005 ShenZhen
範例:
參考connect()。
...inet_addr
inet_addr(將網路地址轉成二進位制的數字)
相關函式 inet_aton,inet_ntoa
表頭檔案 #include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定義函式 unsigned long int inet_addr(const char *cp);
函式說明 inet_addr()用來將引數cp所指的網路地址字串轉換成網路所使用的二進位制數字。網路地址字串是以數字和點組成的字串,例如:
“163.13.132.68”。
返回值 成功則返回對應的網路二進位制的數字,失敗返回-1。
Linhan 2005 ShenZhen
範例:
無
...inet_aton
inet_aton(將網路地址轉成網路二進位制的數字)
相關函式 inet_addr,inet_ntoa
表頭檔案 #include<sys/scoket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定義函式 int inet_aton(const char * cp,struct in_addr *inp);
函式說明 inet_aton()用來將引數cp所指的網路地址字串轉換成網路使用的二進位制的數字,然後存於引數inp所指的in_addr結構中。
結構in_addr定義如下
struct in_addr
{
unsigned long int s_addr;
};
返回值 成功則返回非0值,失敗則返回0。
Linhan 2005 ShenZhen
範例:
無
...inet_ntoa
inet_ntoa(將網路二進位制的數字轉換成網路地址)
相關函式 inet_addr,inet_aton
表頭檔案 #include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
定義函式 char * inet_ntoa(struct in_addr in);
函式說明 inet_ntoa()用來將引數in所指的網路二進位制的數字轉換成網路地址,然後將指向此網路地址字串的指標返回。
返回值 成功則返回字串指標,失敗則返回NULL。
Linhan 2005 ShenZhen
範例:
無
...listen
listen(等待連線)
相關函式 socket,bind,accept,connect
表頭檔案 #include<sys/socket.h>
定義函式 int listen(int s,int backlog);
函式說明 listen()用來等待引數s 的socket連線。引數backlog指定同時能處
理的最大連線要求,如果連線數目達此上限則client端將收到
ECONNREFUSED的錯誤。Listen()並未開始接收連線,只是設定
socket為listen模式,真正接收client端連線的是accept()。通常
listen()會在socket(),bind()之後呼叫,接著才呼叫accept()。
返回值 成功則返回0,失敗返回-1,錯誤原因存於errno
附加說明 listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket型別。如果socket為AF_INET則引數backlog
最大值可設至128。
錯誤程式碼 EBADF 引數sockfd非合法socket處理程式碼
EACCESS 許可權不足
EOPNOTSUPP 指定的socket並未支援listen模式。
Linhan 2005 ShenZhen
範例:
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define PORT 1234
#define MAXSOCKFD 10
main()
{
int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
fd_set readfds;
char buffer[256];
char msg[ ] =”Welcome to server!”;
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,&addr,sizeof(addr))<0){
perror(“connect”);
exit(1);
}
if(listen(sockfd,3)<0){
perror(“listen”);
exit(1);
}
for(fd=0;fd<MAXSOCKFD;fd++)
is_connected[fd]=0;
while(1){
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
for(fd=0;fd<MAXSOCKFD;fd++)
if(is_connected[fd]) FD_SET(fd,&readfds);
if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;
for(fd=0;fd<MAXSOCKFD;fd++)
if(FD_ISSET(fd,&readfds)){
if(sockfd = =fd){
if((newsockfd = accept (sockfd,&addr,&addr_len))<0)
perror(“accept”);
write(newsockfd,msg,sizeof(msg));
is_connected[newsockfd] =1;
printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr));
}else{
bzero(buffer,sizeof(buffer));
if(read(fd,buffer,sizeof(buffer))<=0){
printf(“connect closed.\n”);
is_connected[fd]=0;
close(fd);
}else
printf(“%s”,buffer);
}
}
}
}
執行 $ ./listen
connect from 127.0.0.1
hi I am client
connected closed.
...ntohl
ntohl(將32位網路字元順序轉換成主機字元順序)
相關函式 htonl,htons,ntohs
表頭檔案 #include<netinet/in.h>
定義函式 unsigned long int ntohl(unsigned long int netlong);
函式說明 ntohl()用來將引數指定的32位netlong轉換成主機字元順序。
返回值 返回對應的主機字元順序。
Linhan 2005 ShenZhen
範例:
參考getservent()。
...ntohs
ntohs(將16位網路字元順序轉換成主機字元順序)
相關函式 htonl,htons,ntohl
表頭檔案 #include<netinet/in.h>
定義函式 unsigned short int ntohs(unsigned short int netshort);
函式說明 ntohs()用來將引數指定的16位netshort轉換成主機字元順序。
返回值 返回對應的主機順序。
Linhan 2005 ShenZhen
範例:
參考getservent()。
...recv
recv(經socket接收資料)
相關函式 recvfrom,recvmsg,send,sendto,socket
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int recv(int s,void *buf,int len,unsigned int flags);
函式說明 recv()用來接收遠端主機經指定的socket傳來的資料,並把資料存到由引數buf 指向的記憶體空間,引數len為可接收資料的最大長度。
引數 flags一般設0。其他數值定義如下:
MSG_OOB 接收以out-of-band 送出的資料。
MSG_PEEK 返回來的資料並不會在系統內刪除,如果再呼叫recv()會
返回相同的資料內容。
MSG_WAITALL強迫接收到len大小的資料後才能返回,除非有錯誤或
訊號產生。
MSG_NOSIGNAL此操作不願被SIGPIPE訊號中斷返回值成功則返回接收
到的字元數,失敗返回-1,錯誤原因存於errno中。
錯誤程式碼 EBADF 引數s非合法的socket處理程式碼
EFAULT 引數中有一指標指向無法存取的記憶體空間
ENOTSOCK 引數s為一檔案描述詞,非socket。
EINTR 被訊號所中斷
EAGAIN 此動作會令程序阻斷,但引數s的socket為不可阻斷
ENOBUFS 系統的緩衝記憶體不足。
ENOMEM 核心記憶體不足
EINVAL 傳給系統呼叫的引數不正確。
Linhan 2005 ShenZhen
範例:
參考listen()。
...recvfrom
recvfrom(經socket接收資料)
相關函式 recv,recvmsg,send,sendto,socket
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int recvfrom(int s,void *buf,int len,unsigned int flags ,struct
sockaddr *from ,int *fromlen);
函式說明 recv()用來接收遠端主機經指定的socket 傳來的資料,並把資料存到由引數buf 指向的記憶體空間,引數len
為可接收資料的最大長度。引數flags 一般設0,其他數值定義請參考recv()。引數from用來指定欲傳送的網路地址,結構sockaddr
請參考bind()。引數fromlen為sockaddr的結構長度。
返回值 成功則返回接收到的字元數,失敗則返回-1,錯誤原因存於errno中。
錯誤程式碼 EBADF 引數s非合法的socket處理程式碼
EFAULT 引數中有一指標指向無法存取的記憶體空間。
ENOTSOCK 引數s為一檔案描述詞,非socket。
EINTR 被訊號所中斷。
EAGAIN 此動作會令程序阻斷,但引數s的socket為不可阻斷。
ENOBUFS 系統的緩衝記憶體不足
ENOMEM 核心記憶體不足
EINVAL 傳給系統呼叫的引數不正確。
範例 /*利用socket的UDP client
此程式會連線UDP server,並將鍵盤輸入的字串傳給server。
Linhan 2005 ShenZhen
UDP server 範例請參考sendto()。
範例:
*/
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/typs.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 2345
#define SERVER_IP “127.0.0.1”
main()
{
int s,len;
struct sockaddr_in addr;
int addr_len =sizeof(struct sockaddr_in);
char buffer[256];
/* 建立socket*/
if((s = socket(AF_INET,SOCK_DGRAM,0))<0){
perror(“socket”);
exit(1);
}
/* 填寫sockaddr_in*/
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
while(1){
bzero(buffer,sizeof(buffer));
/* 從標準輸入裝置取得字串*/
len =read(STDIN_FILENO,buffer,sizeof(buffer));
/* 將字串傳送給server端*/
sendto(s,buffer,len,0,&addr,addr_len);
/* 接收server端返回的字串*/
len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);
printf(“receive: %s”,buffer);
}
}
執行 (先執行udp server 再執行udp client)
hello /*從鍵盤輸入字串*/
receive: hello /*server端返回來的字串*/
...recvmsg
recvmsg(經socket接收資料)
相關函式 recv,recvfrom,send,sendto,sendmsg,socket
表頭檔案 #include<sys/types.h>
#include<sys/socktet.h>
定義函式 int recvmsg(int s,struct msghdr *msg,unsigned int flags);
函式說明 recvmsg()用來接收遠端主機經指定的socket傳來的資料。引數s為已建立好連線的socket,如果利用UDP協議則不需經過連線操作。引數msg指向欲連線的資料結構內容,引數flags一般設0,詳細描述請參考send()。關於結構msghdr的定義請參考sendmsg()。
返回值 成功則返回接收到的字元數,失敗則返回-1,錯誤原因存於errno中。
錯誤程式碼 EBADF 引數s非合法的socket處理程式碼。
EFAULT 引數中有一指標指向無法存取的記憶體空間
ENOTSOCK 引數s為一檔案描述詞,非socket。
EINTR 被訊號所中斷。
EAGAIN 此操作會令程序阻斷,但引數s的socket為不可阻斷。
ENOBUFS 系統的緩衝記憶體不足
ENOMEM 核心記憶體不足
EINVAL 傳給系統呼叫的引數不正確。
Linhan 2005 ShenZhen
範例:
參考recvfrom()。
...send
send(經socket傳送資料)
相關函式 sendto,sendmsg,recv,recvfrom,socket
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int send(int s,const void * msg,int len,unsigned int falgs);
函式說明 send()用來將資料由指定的socket 傳給對方主機。引數s為已建立好連線的socket。引數msg指向欲連線的資料內容,引數len則為資料長度。引數flags一般設0,其他數值定義如下
MSG_OOB 傳送的資料以out-of-band 送出。
MSG_DONTROUTE 取消路由表查詢
MSG_DONTWAIT 設定為不可阻斷運作
MSG_NOSIGNAL 此動作不願被SIGPIPE 訊號中斷。
返回值 成功則返回實際傳送出去的字元數,失敗返回-1。錯誤原因存於errno
錯誤程式碼 EBADF 引數s 非合法的socket處理程式碼。
EFAULT 引數中有一指標指向無法存取的記憶體空間
ENOTSOCK 引數s為一檔案描述詞,非socket。
EINTR 被訊號所中斷。
EAGAIN 此操作會令程序阻斷,但引數s的socket為不可阻斷。
ENOBUFS 系統的緩衝記憶體不足
ENOMEM 核心記憶體不足
EINVAL 傳給系統呼叫的引數不正確。
Linhan 2005 ShenZhen
範例:
參考connect()
...sendmsg
sendmsg(經socket傳送資料)
相關函式 send,sendto,recv,recvfrom,recvmsg,socket
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int sendmsg(int s,const strcut msghdr *msg,unsigned int flags);
函式說明 sendmsg()用來將資料由指定的socket傳給對方主機。引數s為已建立好連線的socket,如果利用UDP協議則不需經過連線操作。引數msg
指向欲連線的資料結構內容,引數flags一般預設為0,詳細描述請參考send()。
結構msghdr定義如下
struct msghdr
{
void *msg_name; /*Address to send to /receive from . */
socklen_t msg_namelen; /* Length of addres data */
strcut iovec * msg_iov; /* Vector of data to send/receive
into */
size_t msg_iovlen; /* Number of elements in the vector */
void * msg_control; /* Ancillary dat */
size_t msg_controllen; /* Ancillary data buffer length */
int msg_flags; /* Flags on received message */
};
返回值 成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno
錯誤程式碼 EBADF 引數s 非合法的socket處理程式碼。
EFAULT 引數中有一指標指向無法存取的記憶體空間
ENOTSOCK 引數s為一檔案描述詞,非socket。
EINTR 被訊號所中斷。
EAGAIN 此操作會令程序阻斷,但引數s的socket為不可阻斷。
ENOBUFS 系統的緩衝記憶體不足
ENOMEM 核心記憶體不足
EINVAL 傳給系統呼叫的引數不正確。
Linhan 2005 ShenZhen
範例:
參考sendto()。
...sendto
sendto(經socket傳送資料)
相關函式 send , sendmsg,recv , recvfrom , socket
表頭檔案 #include < sys/types.h >
#include < sys/socket.h >
定義函式 int sendto ( int s , const void * msg, int len, unsigned int flags,
const struct sockaddr * to , int tolen ) ;
函式說明 sendto() 用來將資料由指定的socket傳給對方主機。引數s為已建好連線的socket,如果利用UDP協議則不需經過連線操作。引數msg指向欲連線的資料內容,引數flags
一般設0,詳細描述請參考send()。引數to用來指定欲傳送的網路地址,結構sockaddr請參考bind()。引數tolen為sockaddr的結果長度。
返回值 成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno 中。
錯誤程式碼 EBADF 引數s非法的socket處理程式碼。
EFAULT 引數中有一指標指向無法存取的記憶體空間。
WNOTSOCK canshu s為一檔案描述詞,非socket。
EINTR 被訊號所中斷。
EAGAIN 此動作會令程序阻斷,但引數s的soket為補課阻斷的。
ENOBUFS 系統的緩衝記憶體不足。
EINVAL 傳給系統呼叫的引數不正確。
Linhan 2005 ShenZhen
範例:
#include < sys/types.h >
#include < sys/socket.h >
# include <netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345 /*使用的port*/
main(){
int sockfd,len;
struct sockaddr_in addr;
char buffer[256];
/*建立socket*/
if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){
perror (“socket”);
exit(1);
}
/*填寫sockaddr_in 結構*/
bzero ( &addr, sizeof(addr) );
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr=hton1(INADDR_ANY) ;
if (bind(sockfd, &addr, sizeof(addr))<0){
perror(“connect”);
exit(1);
}
while(1){
bezro(buffer,sizeof(buffer));
len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr
&addr_len);
/*顯示client端的網路地址*/
printf(“receive from %s\n “ , inet_ntoa( addr.sin_addr));
/*將字串返回給client端*/
sendto(sockfd,buffer,len,0,&addr,addr_len);”
}
}
執行 請參考recvfrom()
...setprotoent
setprotoent(開啟網路協議的資料檔案)
相關函式 getprotobyname, getprotobynumber, endprotoent
表頭檔案 #include <netdb.h>
定義函式 void setprotoent (int stayopen);
函式說明 setprotoent()用來開啟/etc/protocols, 如果引數stayopen值為1,則接下來的getprotobyname()或getprotobynumber()將不會自動關閉此檔案。
Linhan 2005 ShenZhen
範例:
無
...setservent
setservent(開啟主機網路服務的資料檔案)
相關函式 getservent, getservbyname, getservbyport, endservent
表頭檔案 #include < netdb.h >
定義函式 void setservent (int stayopen);
函式說明 setservent()用來開啟/etc/services,如果引數stayopen值為1,則接下來的getservbyname()或getservbyport()將補回自動關閉檔案。
Linhan 2005 ShenZhen
範例:
無
...setsockopt
setsockopt(設定socket狀態)
相關函式 getsockopt
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int setsockopt(int s,int level,int optname,const void *
optval,,socklen_toptlen);
函式說明 setsockopt()用來設定引數s所指定的socket狀態。引數level代表
欲設定的網路層,一般設成SOL_SOCKET以存取socket層。引數
optname代表欲設定的選項,有下列幾種數值:
SO_DEBUG 開啟或關閉排錯模式
SO_REUSEADDR 允許在bind()過程中本地地址可重複使用
SO_TYPE 返回socket形態。
SO_ERROR 返回socket已發生的錯誤原因
SO_DONTROUTE 送出的資料包不要利用路由裝置來傳輸。
SO_BROADCAST 使用廣播方式傳送
SO_SNDBUF 設定送出的暫存區大小
SO_RCVBUF 設定接收的暫存區大小
SO_KEEPALIVE 定期確定連線是否已終止。
SO_OOBINLINE 當接收到OOB 資料時會馬上送至標準輸入裝置
SO_LINGER 確保資料安全且可靠的傳送出去。
引數 optval代表欲設定的值,引數optlen則為optval的長度。
返回值 成功則返回0,若有錯誤則返回-1,錯誤原因存於errno。
附加說明 EBADF 引數s並非合法的socket處理程式碼
ENOTSOCK 引數s為一檔案描述詞,非socket
ENOPROTOOPT 引數optname指定的選項不正確。
EFAULT 引數optval指標指向無法存取的記憶體空間。
Linhan 2005 ShenZhen
範例:
參考getsockopt()。
...shutdown
shutdown(終止socket通訊)
相關函式 socket,connect
表頭檔案 #include<sys/socket.h>
定義函式 int shutdown(int s,int how);
函式說明 shutdown()用來終止引數s所指定的socket連線。引數s是連線中的
socket處理程式碼,引數how有下列幾種情況:
how=0 終止讀取操作。
how=1 終止傳送操作
how=2 終止讀取及傳送操作
返回值 成功則返回0,失敗返回-1,錯誤原因存於errno。
錯誤程式碼 EBADF 引數s不是有效的socket處理程式碼
ENOTSOCK 引數s為一檔案描述詞,非socket
ENOTCONN 引數s指定的socket並未連線
Linhan 2005 ShenZhen
範例:
無
...socket
socket(建立一個socket通訊)
相關函式 accept,bind,connect,listen
表頭檔案 #include<sys/types.h>
#include<sys/socket.h>
定義函式 int socket(int domain,int type,int protocol);
函式說明 socket()用來建立一個新的socket,也就是向系統註冊,通知系統建立一通訊埠。引數domain
指定使用何種的地址型別,完整的定義在/usr/include/bits/socket.h 內,底下是常見的協議:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 程序通訊協議
PF_INET?AF_INET Ipv4網路協議
PF_INET6/AF_INET6 Ipv6 網路協議
PF_IPX/AF_IPX IPX-Novell協議
PF_NETLINK/AF_NETLINK 核心使用者介面裝置
PF_X25/AF_X25 ITU-T X.25/ISO-8208 協議
PF_AX25/AF_AX25 業餘無線AX.25協議
PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs
PF_APPLETALK/AF_APPLETALK appletalk(DDP)協議
PF_PACKET/AF_PACKET 初級封包介面
引數 type有下列幾種數值:
SOCK_STREAM 提供雙向連續且可信賴的資料流,即TCP。支援
OOB 機制,在所有資料傳送前必須使用connect()來建立連線狀態。
SOCK_DGRAM 使用不連續不可信賴的資料包連線
SOCK_SEQPACKET 提供連續可信賴的資料包連線
SOCK_RAW 提供原始網路協議存取
SOCK_RDM 提供可信賴的資料包連線
SOCK_PACKET 提供和網路驅動程式直接通訊。
protocol用來指定socket所使用的傳輸協議編號,通常此參考不用
管它,設為0即可。
返回值 成功則返回socket處理程式碼,失敗返回-1。
錯誤程式碼 EPROTONOSUPPORT 引數domain指定的型別不支援引數type或protocol指定的協議
ENFILE 核心記憶體不足,無法建立新的socket結構
EMFILE 程序檔案表溢位,無法再建立新的socket
EACCESS 許可權不足,無法建立type或protocol指定的協議
ENOBUFS/ENOMEM 記憶體不足
EINVAL 引數domain/type/protocol不合法
Linhan 2005 ShenZhen
範例:
參考connect()。
...atexit
atexit(設定程式正常結束前呼叫的函式)
相關函式 _exit,exit,on_exit
表頭檔案 #include<stdlib.h>
定義函式 int atexit (void (*function)(void));
函式說明 atexit()用來設定一個程式正常結束前呼叫的函式。當程式通過呼叫exit()或從main中返回時,引數function所指定的函式會先被呼叫,然後才真正由exit()結束程式。
返回值 如果執行成功則返回0,否則返回-1,失敗原因存於errno中。
Linhan 2005 ShenZhen
範例:
#include<stdlib.h>
void my_exit(void)
{
printf(“before exit () !\n”);
}
main()
{
atexit (my_exit);
exit(0);
}
執行 before exit()!
...execl
execl(執行檔案)
相關函式 fork,execle,execlp,execv,execve,execvp
表頭檔案 #include<unistd.h>
定義函式 int execl(const char * path,const char * arg,....);
函式說明 execl()用來執行引數path字串所代表的檔案路徑,接下來的引數代表執行該檔案時傳遞過去的argv(0)、argv[1]……,最後一個引數必須用空指標(NULL)作結束。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno中。
Linhan 2005 ShenZhen
範例:
#include<unistd.h>
main()
{
execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )
0);
}
執行
/*執行/bin/ls -al /etc/passwd */
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
...execlp
execlp(從PATH 環境變數中查詢檔案並執行)
相關函式 fork,execl,execle,execv,execve,execvp
表頭檔案 #include<unistd.h>
定義函式 int execlp(const char * file,const char * arg,……);
函式說明 execlp()會從PATH
環境變數所指的目錄中查詢符合引數file的檔名,找到後便執行該檔案,然後將第二個以後的引數當做該檔案的argv[0]、argv[1]……,最後一個引數必須用空指標(NULL)作結束。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤程式碼 參考execve()。
Linhan 2005 ShenZhen
範例:
/* 執行ls -al /etc/passwd execlp()會依PATH 變數中的/bin找到/bin/ls */
#include<unistd.h>
main()
{
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
執行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
...execv
execv(執行檔案)
相關函式 fork,execl,execle,execlp,execve,execvp
表頭檔案 #include<unistd.h>
定義函式 int execv (const char * path, char * const argv[ ]);
函式說明 execv()用來執行引數path字串所代表的檔案路徑,與execl()不同的地方在於execve()只需兩個引數,第二個引數利用陣列指標來傳遞給執行檔案。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤程式碼 請參考execve()。
Linhan 2005 ShenZhen
範例:
/* 執行/bin/ls -al /etc/passwd */
#include<unistd.h>
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
execv(“/bin/ls”,argv);
}
執行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
...execve
execve(執行檔案)
相關函式 fork,execl,execle,execlp,execv,execvp
表頭檔案 #include<unistd.h>
定義函式 int execve(const char * filename,char * const argv[ ],char
* const envp[ ]);
函式說明 execve()用來執行引數filename字串所代表的檔案路徑,第二個
引數系利用陣列指標來傳遞給執行檔案,最後一個引數則為傳遞給
執行檔案的新環境變數陣列。
返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因
存於errno 中。
錯誤程式碼 EACCES
1. 欲執行的檔案不具有使用者可執行的許可權。
2. 欲執行的檔案所屬的檔案系統是以noexec 方式掛上。
3.欲執行的檔案或script翻譯器非一般檔案。
EPERM
1.程序處於被追蹤模式,執行者並不具有root許可權,欲執行的檔案
具有SUID 或SGID 位。
2.欲執行的檔案所屬的檔案系統是以nosuid方式掛上,欲執行的文
件具有SUID 或SGID 位元,但執行者並不具有root許可權。
E2BIG 引數陣列過大
ENOEXEC 無法判斷欲執行檔案的執行檔案格式,有可能是格式錯誤
或無法在此平臺執行。
EFAULT 引數filename所指的字串地址超出可存取空間範圍。
ENAMETOOLONG 引數filename所指的字串太長。
ENOENT 引數filename字串所指定的檔案不存在。
ENOMEM 核心記憶體不