深信服 linux軟體開發面試題整理
阿新 • • 發佈:2019-02-14
1、結構體可以進行比較
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
Compare two blocks of memory
Compares the first num bytes of the block of memory pointed by ptr1 to the first num bytes pointed by ptr2, returning zero if they all match or a value different from zero representing which is greater if they do not.
Notice that, unlike strcmp, the function does not stop comparing after finding a null character.
Returns an integral value indicating the relationship between the content of the memory blocks:
A zero value indicates that the contents of both memory blocks are equal.
A value greater than zero indicates that the first byte that does not match in both memory blocks has a greater value in ptr1 than in ptr2 as if evaluated as unsigned char values; And a value less than zero indicates the opposite.
2、最大開啟檔案數檢視與設定
檢視系統級最大開啟檔案數# cat /proc/sys/fs/file-max
檢視當前使用者最大開啟檔案數# ulimit -Hn //檢視硬限制
# ulimit -Sn //檢視軟限制
系統級的設定# vi /etc/sysctl.conf
增加:fs.file-max = 100000
立即生效:# sysctl -p
使用者級設定# vi /etc/security/limits.conf
設定如下:
httpd soft nofile 4096
httpd hard nofile 10240
httpd是使用者,可以使用萬用字元*表示所有使用者。
要使 limits.conf 檔案配置生效,必須要確保 pam_limits.so 檔案被加入到啟動檔案中。
檢視 /etc/pam.d/login 檔案中有:
session required /lib/security/pam_limits.so
也可以在/etc/profile後面加上ulimit -n 10240
使用如下命令立即生效:
# su - httpd
$ ulimit -Hn 10240
$ ulimit -Sn 4096
硬限制是可以在任何時候任何程序中設定 但硬限制只能由超級使用者提起
軟限制是核心實際執行的限制,任何程序都可以將軟限制設定為任意小於等於對程序限制的硬限制的值
C語言檔案指標(fopen)與檔案描述符(open)之間可以相互轉換:
int fileno(FILE *stream);
FILE *fdopen(int fd, const char *mode);
3、程序間通訊方式
linux下程序間通訊的幾種主要手段簡介:
管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;
訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);
報文(Message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。
訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。
套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。
http://www.ibm.com/developerworks/cn/linux/l-ipc/
一般來說,linux下的程序包含以下幾個關鍵要素:
有一段可執行程式;
有專用的系統堆疊空間;
核心中有它的控制塊(程序控制塊),描述程序所佔用的資源,這樣,程序才能接受核心的排程;
具有獨立的儲存空間
4、Linux多執行緒同步的幾種方式
1)互斥鎖(mutex)
通過鎖機制實現執行緒間的同步。同一時刻只允許一個執行緒執行一個關鍵部分的程式碼。
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *mutex);
int pthread_mutex_destroy(pthread_mutex *mutex);
互斥鎖靜態賦值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER
attr_t有:
PTHREAD_MUTEX_TIMED_NP:其餘執行緒等待佇列
PTHREAD_MUTEX_RECURSIVE_NP:巢狀鎖,允許執行緒多次加鎖,不同執行緒,解鎖後重新競爭
PTHREAD_MUTEX_ERRORCHECK_NP:檢錯,與一同,執行緒請求已用鎖,返回EDEADLK;
PTHREAD_MUTEX_ADAPTIVE_NP:適應鎖,解鎖後重新競爭
2)條件變數(cond)
利用執行緒間共享的全域性變數進行同步的一種機制。條件變數上的基本操作有:觸發條件(當條件變為 true 時);等待條件,掛起執行緒直到其他執行緒觸發條件。
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有執行緒的阻塞
int pthread_cond_destroy(pthread_cond_t *cond);
pthread_cond_t cond=PTHREAD_COND_INITIALIER
void pthread_cleanup_push(void (*rtn)(void *),void *arg);
void pthread_cleanup_pop(int execute);
pthread_cleanup_push來註冊清理函式rtn,這個函式有一個引數arg。在以下三種情形之一發生時,註冊的清理函式被執行:
1)呼叫pthread_exit。
2)作為對取消執行緒請求(pthread_cancel)的響應。
3)以非0引數呼叫pthread_cleanup_pop。
注意:
1)如果執行緒只是由於簡單的返回而終止的,則清除函式不會被呼叫。
2)如果pthread_cleanup_pop被傳遞0引數,則清除函式不會被呼叫,但是會清除處於棧頂的清理函式。
3)訊號量(sem)
#include <semaphore.h>
int sem_init (sem_t *sem , int pshared, unsigned int value);
int sem_wait(sem_t *sem); //-1
int sem_post(sem_t *sem);//+1
int sem_destroy(sem_t *sem);
5、大端小端
大端位元組(Big-endian):較高的有效位元組存放在較低的儲存器地址,較低的有效位元組存放在較高的儲存器地址。
小端位元組(Big-endian):字資料的高位元組儲存在高地址中,而字資料的低位元組則存放在低地址中。
/********大端返回0;小端返回1*******/
int checkCPU()
{
union w
{
int x ;
char y ;
}c ;
c.x = 1;
return (c.y==1);
}
6、結構體中位域對齊
由於位域不允許跨兩個位元組,因此位域長度不超過8 。
儲存原則:
整個位域結構體的大小為其最寬基本型別成員大小的整數倍;
如果位域欄位之間穿插著非位域欄位,則不進行壓縮;
如果相鄰的兩個位域欄位的型別不同,則各個編譯器的具體實現有差異,VC6採取不壓縮方式,GCC和Dev-C++都採用壓縮方式;
struct BFA
{
unsigned char a:2;
unsigned int b;
};//gcc 8個位元組
struct BFB
{
unsigned char a:2;
unsigned char b:3;
unsigned char c:3;
unsigned int d:4; //多出來這個位域欄位;
};//gcc 4個位元組
取地址操作符&不能應用在位域欄位上;
位域欄位不能是類的靜態成員;
位域欄位在記憶體中的位置是按照從低位向高位的順序放置的;
struct BitField
{
unsigned char a:2; //最低位;
unsigned char b:3;
unsigned char c:3; //最高位;
};
union Union
{
struct BitField bf;
unsigned int n;
};
union Union ubf;
ubf.n = 0; //初始化;
ubf.bf.a = 0; //二進位制為: 00
ubf.bf.b = 0; //二進位制為: 000
ubf.bf.c = 1; //二進位制為: 001
printf("ubf.bf.n = %u\n", ubf.n);
結果:32
本段出自 http://bdxnote.blog.163.com/blog/static/844423520109103132722/
7、setsockopt(),select()函式的應用
8、TCP / UDP C/S框架
參見華清遠見《基於Socket的UDP和TCP程式設計介紹》博文
http://www.embedu.org/column/column179.htm
connect函式在UDP中的應用
http://www.embedu.org/Column/Column220.htm
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
Compare two blocks of memory
Compares the first num bytes of the block of memory pointed by ptr1 to the first num bytes pointed by ptr2, returning zero if they all match or a value different from zero representing which is greater if they do not.
Notice that, unlike strcmp, the function does not stop comparing after finding a null character.
Returns an integral value indicating the relationship between the content of the memory blocks:
A zero value indicates that the contents of both memory blocks are equal.
A value greater than zero indicates that the first byte that does not match in both memory blocks has a greater value in ptr1 than in ptr2 as if evaluated as unsigned char values; And a value less than zero indicates the opposite.
#include <stdio.h> #include <string.h> struct suo{ char name[40]; int age; } person, person_copy; int main () { int n; char myname[] = "Pierre de Fermat"; /* using memcpy to copy string: */ memcpy ( person.name, myname, strlen(myname)+1 ); person.age = 46; /* using memcpy to copy structure: */ memcpy ( &person_copy, &person, sizeof(person) ); printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age ); n = memcmp(&person_copy, &person, sizeof(struct suo) ); if ( n > 0 ) printf("greater"); else if ( n < 0 ) printf("smaller"); else printf("=\n"); return 0; }
2、最大開啟檔案數檢視與設定
檢視系統級最大開啟檔案數# cat /proc/sys/fs/file-max
檢視當前使用者最大開啟檔案數# ulimit -Hn //檢視硬限制
# ulimit -Sn //檢視軟限制
系統級的設定# vi /etc/sysctl.conf
增加:fs.file-max = 100000
立即生效:# sysctl -p
使用者級設定# vi /etc/security/limits.conf
設定如下:
httpd soft nofile 4096
httpd hard nofile 10240
httpd是使用者,可以使用萬用字元*表示所有使用者。
要使 limits.conf 檔案配置生效,必須要確保 pam_limits.so 檔案被加入到啟動檔案中。
檢視 /etc/pam.d/login 檔案中有:
session required /lib/security/pam_limits.so
也可以在/etc/profile後面加上ulimit -n 10240
使用如下命令立即生效:
# su - httpd
$ ulimit -Hn 10240
$ ulimit -Sn 4096
硬限制是可以在任何時候任何程序中設定 但硬限制只能由超級使用者提起
軟限制是核心實際執行的限制,任何程序都可以將軟限制設定為任意小於等於對程序限制的硬限制的值
C語言檔案指標(fopen)與檔案描述符(open)之間可以相互轉換:
int fileno(FILE *stream);
FILE *fdopen(int fd, const char *mode);
3、程序間通訊方式
linux下程序間通訊的幾種主要手段簡介:
管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;
訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);
報文(Message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。
訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。
套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。
http://www.ibm.com/developerworks/cn/linux/l-ipc/
一般來說,linux下的程序包含以下幾個關鍵要素:
有一段可執行程式;
有專用的系統堆疊空間;
核心中有它的控制塊(程序控制塊),描述程序所佔用的資源,這樣,程序才能接受核心的排程;
具有獨立的儲存空間
4、Linux多執行緒同步的幾種方式
1)互斥鎖(mutex)
通過鎖機制實現執行緒間的同步。同一時刻只允許一個執行緒執行一個關鍵部分的程式碼。
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *mutex);
int pthread_mutex_destroy(pthread_mutex *mutex);
互斥鎖靜態賦值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER
attr_t有:
PTHREAD_MUTEX_TIMED_NP:其餘執行緒等待佇列
PTHREAD_MUTEX_RECURSIVE_NP:巢狀鎖,允許執行緒多次加鎖,不同執行緒,解鎖後重新競爭
PTHREAD_MUTEX_ERRORCHECK_NP:檢錯,與一同,執行緒請求已用鎖,返回EDEADLK;
PTHREAD_MUTEX_ADAPTIVE_NP:適應鎖,解鎖後重新競爭
2)條件變數(cond)
利用執行緒間共享的全域性變數進行同步的一種機制。條件變數上的基本操作有:觸發條件(當條件變為 true 時);等待條件,掛起執行緒直到其他執行緒觸發條件。
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有執行緒的阻塞
int pthread_cond_destroy(pthread_cond_t *cond);
pthread_cond_t cond=PTHREAD_COND_INITIALIER
void pthread_cleanup_push(void (*rtn)(void *),void *arg);
void pthread_cleanup_pop(int execute);
pthread_cleanup_push來註冊清理函式rtn,這個函式有一個引數arg。在以下三種情形之一發生時,註冊的清理函式被執行:
1)呼叫pthread_exit。
2)作為對取消執行緒請求(pthread_cancel)的響應。
3)以非0引數呼叫pthread_cleanup_pop。
注意:
1)如果執行緒只是由於簡單的返回而終止的,則清除函式不會被呼叫。
2)如果pthread_cleanup_pop被傳遞0引數,則清除函式不會被呼叫,但是會清除處於棧頂的清理函式。
3)訊號量(sem)
#include <semaphore.h>
int sem_init (sem_t *sem , int pshared, unsigned int value);
int sem_wait(sem_t *sem); //-1
int sem_post(sem_t *sem);//+1
int sem_destroy(sem_t *sem);
5、大端小端
大端位元組(Big-endian):較高的有效位元組存放在較低的儲存器地址,較低的有效位元組存放在較高的儲存器地址。
小端位元組(Big-endian):字資料的高位元組儲存在高地址中,而字資料的低位元組則存放在低地址中。
/********大端返回0;小端返回1*******/
int checkCPU()
{
union w
{
int x ;
char y ;
}c ;
c.x = 1;
return (c.y==1);
}
6、結構體中位域對齊
由於位域不允許跨兩個位元組,因此位域長度不超過8 。
儲存原則:
整個位域結構體的大小為其最寬基本型別成員大小的整數倍;
如果位域欄位之間穿插著非位域欄位,則不進行壓縮;
如果相鄰的兩個位域欄位的型別不同,則各個編譯器的具體實現有差異,VC6採取不壓縮方式,GCC和Dev-C++都採用壓縮方式;
struct BFA
{
unsigned char a:2;
unsigned int b;
};//gcc 8個位元組
struct BFB
{
unsigned char a:2;
unsigned char b:3;
unsigned char c:3;
unsigned int d:4; //多出來這個位域欄位;
};//gcc 4個位元組
取地址操作符&不能應用在位域欄位上;
位域欄位不能是類的靜態成員;
位域欄位在記憶體中的位置是按照從低位向高位的順序放置的;
struct BitField
{
unsigned char a:2; //最低位;
unsigned char b:3;
unsigned char c:3; //最高位;
};
union Union
{
struct BitField bf;
unsigned int n;
};
union Union ubf;
ubf.n = 0; //初始化;
ubf.bf.a = 0; //二進位制為: 00
ubf.bf.b = 0; //二進位制為: 000
ubf.bf.c = 1; //二進位制為: 001
printf("ubf.bf.n = %u\n", ubf.n);
結果:32
本段出自 http://bdxnote.blog.163.com/blog/static/844423520109103132722/
7、setsockopt(),select()函式的應用
8、TCP / UDP C/S框架
參見華清遠見《基於Socket的UDP和TCP程式設計介紹》博文
http://www.embedu.org/column/column179.htm
connect函式在UDP中的應用
http://www.embedu.org/Column/Column220.htm
http://blog.csdn.net/mycoolx/article/details/6314354
9、說說你知道的經典排序演算法名稱