1. 程式人生 > >筆試題錯題本

筆試題錯題本

字符串復制 不可 方式 父類 進程切換 find 成員函數 quest comm

1.以下三條輸出語句分別輸出什麽?

int main (void) {

char str1[] = “abc”;

char str2[] = “abc”;

const char str3[] = “abc”;

const char str4[] = “abc”;

const char* str5 = “abc”;

const char* str6 = “abc”;

cout << (str1 == str2) << endl;

cout << (str3 == str4) << endl;

cout << (str5 == str6) << endl;

return 0;

}

第一個,第二個存放的是地址 第三個是指針指向的字符串

2.已知函數fun的原型為int fun(int,int,int);下列重載函數原型中錯誤的是

char fun(int,int);
double  fun(int,int,double);
int fun(int,char*);
float  fun (int,int,int);
函數重載和返回類型無關,參數列表不同即可
3.

不同進程加載同一個動態庫時,不能共享的部分是

RO段
RW段
ZI段
RW和ZI段
在ARM集成開發環境中: 1)只讀的代碼段和常量被稱作RO段,是程序中的指令和常量; 2)可讀寫的全局變量和靜態變量稱為RW段,是程序中已初始化變量; 3)RW段中要被初始化為0的變量稱為ZI段,是程序中未初始化變量。 只有只讀的指令和常量可以共享。 4.線程共享的進程環境包括:
  • 進程代碼段
  • 進程的公有資源(如全局變量,利用這些共享的數據,線程很容易的實現相互之間的通信)
  • 進程打開的文件描述符
  • 消息隊列
  • 信號的處理器
  • 進程的當前目錄
  • 進程用戶ID
  • 進程組ID
線程獨占資源:
  • 線程ID
  • 寄存器組的值
  • 用戶棧、內核棧(在一個進程的線程共享堆區(heap))
  • 錯誤返回碼
  • 線程的信號屏蔽碼
  • 線程的優先級

堆: 是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統對進程初始化的時候分配,運行過程中也可以向系統要額外的堆,但是記得用完了要還給操作系統,要不然就是內存泄漏。

棧:是個線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每個線程的棧互相獨立,因此,棧是 thread safe的。操作系統在切換線程的時候會自動的切換棧,就是切換 SS/ESP寄存器。棧空間不需要在高級語言裏面顯式的分配和釋放

5.請問linux系統發送信號的系統調用是

系統調用signal是進程用來設定某個信號的處理方法,系統調用kill是用來發送信號給指定進程的。 這 兩個調用可以形成信號的基本操作。 後兩個調用pause和alarm是通過信號實現的進程暫停和定時器,調用alarm是通過信號通知進程定時器到時。 6.在定點二進制運算器中,減法運算一般通過( )來實現 補碼運算的二進制加法器
7.操作系統在控制和管理進程過程中,涉及到(   )這一重要數據結構,這是進程存在的唯一標誌。

每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。
/usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct 結構體定義。其內部成員有很多,重點:

  • 進程id。系統中每個進程有唯一的id,在C語言中用pid_t類型表- 示,其實就是一個非負整數。
  • 進程的狀態,有就緒、運行、掛起、停止等狀態。
  • 進程切換時需要保存和恢復的一些CPU寄存器。
  • 描述虛擬地址空間的信息。
  • 描述控制終端的信息。
  • 當前工作目錄(Current Working Directory)。
  • umask掩碼。
  • 文件描述符表,包含很多指向file結構體的指針。
  • 和信號相關的信息。
  • 用戶id和組id。
  • 會話(Session)和進程組。
  • 進程可以使用的資源上限(Resource Limit)。
進程控制塊(Processing Control Block),是操作系統進程中一種數據結構,主要表示進程狀態。其作用是使一個在多道程序環境下不能獨立運行的程序(含數據),成為一個能獨立運行的基本單位或與其它進程並發執行的進程。或者說,OS是根據PCB來對並發執行的進程進行控制和管理的。 PCB通常是系統內存占用區中的一個連續存區,它存放著操作系統用於描述進程情況及控制進程運行所需的全部信息,它使一個在多道程序環境下不能獨立運行的程序成為一個能獨立運行的基本單位或一個能與其他進程並發執行的進程。 8.已知代碼char* p=(char*)malloc(val);其中p在運行的時候獲得了一個空指針,請列舉三種可能的原因?()()() (1) 空間太小
(2) 內存碎片
(3) val取值過大 9.兩個進程間需要交換1KB的數據,請列出三種進程間通訊的方法()()() 進程間IPC的方法: 1. pipe 又分為匿名和命名pipe,前者用於具有一定關系的進程間的通信,(通過fork進制)後者FIFO可以用於不具有任何關系的進程通信 2. socket 其實有些平臺的pipe的底層實現就是使用unix socket。 3. signal 通過信號處理機制也能使兩個進程進行通信(同步) 4. message 通過消息隊列,可以使任何兩個進程進行通信 5. semaphore 信號量,是任意進程同步的工具 6. shared memory 其也是通信速率最快的一種方式,但是多個進程同時訪問該區域,就需要讀寫控制,使用進程間鎖或者信號量來搭配使用。 7. file 通過對一個文件的讀寫,來通信也是一種手段,但是需要同步控制。

10.Android四大組件是:Activity、Service、Broadcast Receiver、Content Provider

11.JAVA中,final修飾的類、成員函數、變量分別有什麽特點?

類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。

將變量聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在new一個對象時初始化(即只能在聲明變量或構造器或代碼塊內初始化),而在以後的引用中只能讀取,不可修改。

將方法聲明為final,則方法只能使用,而不能在子類重寫。

12.java中Thread.sleep()和 Object.wait() 有什麽區別?

sleep是使線程休眠一段時間。在sleep休眠時間到期後,線程不一定立即恢復執行,除非系統沒有其它更高優先級的任務正在執行

wait是線程間實現同步的一種機制。調用wait的線程會主動進入等待狀態,直到被其它線程喚醒或者等待超時

13.sprintf、strcpy、strncpy及 memcpy 函數,請問這些函數功能有什麽區別?從安全角度考慮一般應該用哪個函數復制字符串?

sprintf為格式化字符串函數

strcpy為字符串復制函數

strncpy也是字符串復制函數,但是可以指定最大復制長度

memcpy為內存復制函數

從安全角度應該選strncpy,不易出現越界異常

14.算法 最長公共子串

function findSubStr(s1,s2){ var S=sstr= "" ,L1=s1.length,L2=s2.length; if (L1>L2){ var s3=s1;s1=s2,s2=s3,L1=s2.length;} for ( var j=L1;j> 0 ;j--) for ( var i= 0 ;i<=L1-j;i++){ sstr = s1.substr(i,j); if (s2.indexOf(sstr)>= 0 ) return sstr; } return "" ; } document .writeln(findSubStr( "aaa3333" , "baa333cc" )); //aa333 document .writeln(findSubStr( "aaaX3333--" , "baa333ccX3333333x" )); //X3333
 


筆試題錯題本