Time of Update: 2017-02-27
概述最常見的進程/線程的同步方法有互斥鎖(或稱互斥量Mutex),讀寫鎖(rdlock),條件變數(cond),訊號量(Semophore)等。在Windows系統中,臨界區(Critical Section)和事件對象(Event)也是常用的同步方法。簡單的說,互斥鎖保護了一個臨界區,在這個臨界區中,一次最多隻能進入一個線程。如果有多個進程在同一個臨界區內活動,就有可能產生競態條件(race
Time of Update: 2017-02-27
進程是程式執行時的一個執行個體,即它是程式已經執行到何種程度的資料結構的彙集。從核心的觀點看,進程的目的就是擔當分配系統資源(CPU時間、記憶體等)的基本單位。線程是進程的一個執行流,是CPU調度和指派的基本單位,它是比進程更小的能獨立啟動並執行基本單位。一個進程由幾個線程組成(擁有很多相對獨立的執行流的使用者程式共用應用程式的大部分資料結構),線程與同屬一個進程的其他的線程共用進程所擁有的全部資源。"進程——資源分派的最小單位,線程——
Time of Update: 2017-02-27
zombie不佔用記憶體也不佔用CPU,表面上我們可以不用在乎它們的存在,然而事實上UNIX系統限制了某一時刻能同時存在的進程的最大數目。如果程式不及時清理系統中的zombie,最終會導致進程數過多,當再次需要產生新進程時就會出錯。鑒於上邊的原因,我們需要在子進程調用exit後在父進成中調用wait或waipid#include<sys/types.h>#include<sys/wait.h>pid_t wait(int &statloc);pid_t
Time of Update: 2017-02-27
#include <errno.h> #include <signal.h> #include <unistd.h> intsystem(const char *cmdstring) /* with appropriate signal handling */{ pid_t pid; int status; struct sigaction
Time of Update: 2017-02-27
可重新進入函數可重新進入函數(即可以被中斷的函數)可以被一個以上的任務調用,而不擔心資料破壞。可重新進入函數在任何時候都可以被中斷,而一段時間之後又可以恢複運行,而相應的資料不會破壞或者丟失。可重新進入函數使用的變數有兩種情況:1.使用局部變數,變數儲存在CPU寄存器中或者堆棧中;2.使用全域變數,但是這時候要注意保護全域變數(防止任務中斷後被其它任務改變變數)。void strcpy(*dest,*src){ while(* dest++ = *src ++){;} *dest =
Time of Update: 2017-02-27
$PATH:決定了shell將到哪些目錄中尋找命令或程式,PATH的值是一系列目錄,當您運行一個程式時, Linux在這些目錄下進行搜尋編譯連結。編輯你的 PATH 聲明,其格式為:PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>你可 以自己加上指定的路徑,中間用冒號隔開。環境變數更改後,在使用者下次登陸時生效,如果想立刻生效,則可 執行下面的語句:$ source
Time of Update: 2017-02-27
1、系統調用系統調用提供的函數如open, close, read, write, ioctl等,需包含標頭檔unistd.h 。以write為例:其函數原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對象為文 件描述符或檔案控制代碼fd(file descriptor),要想寫一個檔案,必須先以可寫入權限用open系統調用開啟一個文 件,獲得所開啟檔案的fd,例如
Time of Update: 2017-02-27
1. / 檔案系統的入口,最高一級目錄;2. /bin 基礎系統所需要的命令位於此目錄,是最小系統 所需要的命令,如:ls, cp, mkdir等。這個目錄中的檔案都是可執行檔,一般的使用者都可以使用。3. /boot 包含Linux核心及系統引導程式所需要的檔案,比如 vmlinuz initrd.img 檔案都位於這個 目錄中。在一般情況下,GRUB或LILO系統引導管理器也位於這個目錄;4. /dev 裝置檔案儲存體目錄, 比如音效卡、磁碟... ...
Time of Update: 2017-02-27
在C程式中,檔案由檔案指標或者檔案描述符表示。ISO C的標準I/0庫函數(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用檔案指標,UNIX的I/O函數(open, close, read, write, ioctl)使用文 件描述符。下面重點來說下,檔案描述符是如何工作的。檔案描述符相當於一個邏輯控制代碼,而 open,close等函數則是將檔案或者物理裝置與控制代碼相關聯。控制代碼是一個整數,可以理解為進程特定的檔案描述 符表的
Time of Update: 2017-02-27
real user ID:實際使用者ID,指的是進程執行者是誰effective user ID:有效使用者ID,指進程執行時對檔案的存取權限saved set-user-ID:儲存設定使用者ID,作為effective user ID的副本,在執行exec調用時後能重新恢複原來的effectiv user ID.上面這三個ID是相對於進程而言的.set-user-ID:設定使用者ID,這是相對於檔案來說的.設定了set-user-ID位的可執行程式,執行時,進程的effective user
Time of Update: 2017-02-27
一、GDB的靜態調試啟動方法:1、當需要在命令列通過gdb來啟動可執行程式的時候,可使用一下命令:gdb <可執行程式名>這個時候gdb會載入可執行程式的符號表和堆棧,並為啟動程式作好準備;接下來,需要設定可執行程式的命令列參數:set args <參數列表>然後設定斷點: b或break;最後通過命令r或run來啟動程式,或者通過c或continue命令來繼續已經被暫停程式;2、當程式core的時候,需要查看core檔案的內容,顆使用以下方式:gdb <可執行程式名>
Time of Update: 2017-02-27
#include "apue.h" #include <errno.h> #include <limits.h> #ifdef PATH_MAX static int pathmax = PATH_MAX; #else static int pathmax = 0; #endif #define SUSV3 200112L static long posix_version = 0; /* If PATH_MAX is indeterminate,
Time of Update: 2017-02-27
處理序間通訊必須通過核心提供的通道,而且必須有一種辦法在進程中標識核心提供的某個通道,前面講過的匿名管道是用開啟的檔案描述符來標識的。如果要互相通訊的幾個進程沒有從公用祖先那裡繼承檔案描述符,它們怎麼通訊呢?核心提供一條通道不成問題,問題是如何標識這條通道才能使各進程都可以訪問它?檔案系統中的路徑名是全域的,各進程都可以訪問,因此可以用檔案系統中的路徑名來標識一個IPC通道。FIFO和UNIX Domain
Time of Update: 2017-02-27
一、當沒有資料可讀時O_NONBLOCK disable:read調用阻塞,即進程暫停執行,一直等到有資料來到為止。O_NONBLOCK enable:read調用返回-1,errno值為EAGAIN。樣本程式如下:/************************************************************************* > File Name: process_.c > Author: Simba > Mail: dameng34@1
Time of Update: 2017-02-27
一、sigqueue函數功能:新的發送訊號系統調用,主要是針對即時訊號提出的支援訊號帶有參數,與函數sigaction()配合使用。原型:int sigqueue(pid_t pid, int sig, const union sigval value);參數:sigqueue的第一個參數是指定接收訊號的進程id,第二個參數確定即將發送的訊號,第三個參數是一個聯合資料結構union sigval,指定了訊號傳遞的參數,即通常所說的4位元組值。傳回值:成功返回0,失敗返回-1typedef
Time of Update: 2017-02-27
一、核心如何?訊號的捕捉如果訊號的處理動作是使用者自訂函數,在訊號遞達時就調用這個函數,這稱為捕捉訊號。由於訊號處理函數的代碼是在使用者空間的,處理過程比較複雜,舉例如下:1. 使用者程式註冊了SIGQUIT訊號的處理函數sighandler。2. 當前正在執行main函數,這時發生中斷或異常切換到核心態。3. 在中斷處理完畢後要返回使用者態的main函數之前檢查到有訊號SIGQUIT遞達。4.
Time of Update: 2017-02-27
一、訊號在核心中的表示實際執行訊號的處理動作稱為訊號遞達(Delivery),訊號從產生到遞達之間的狀態,稱為訊號未決(Pending)。進程可以選擇阻塞(Block)某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到進程解除對此訊號的阻塞,才執行遞達的動作。注意,阻塞和忽略是不同的,只要訊號被阻塞就不會遞達,而忽略是在遞達之後可選的一種處理動作。訊號在核心中的表示可以看作是這樣的:每個訊號都有兩個標誌位分別表示阻塞和未決,還有一個函數指標表示處理動作。訊號產生時,核心在進程式控制制塊中設定該訊
Time of Update: 2017-02-27
一、kill, raise, killpg 函數int kill(pid_t pid, int sig);int raise(int sig);int killpg(int pgrp, int sig);kill命令是調用kill函數實現的,kill函數可以給一個指定的進程或進程組發送指定的訊號,其中kill 函數的pid 參數取值不同表示不同含義,具體可man 一下。raise函數可以給當前進程發送指定的訊號(自己給自己發訊號)。killpg 函數可以給進程組發生訊號。這三個函數都是成功返回0
Time of Update: 2017-02-27
一、為了理解訊號,先從我們最熟悉的情境說起:1. 使用者輸入命令,在Shell下啟動一個前台進程。2. 使用者按下Ctrl-C,這個鍵盤輸入產生一個硬體中斷。3. 如果CPU當前正在執行這個進程的代碼,則該進程的使用者空間代碼暫停執行,CPU從使用者態切換到核心態處理硬體中斷。4. 終端驅動程式將Ctrl-C解釋成一個SIGINT訊號,記在該進程的PCB中(也可以說發送了一個SIGINT訊號給該進程)。5. 當某個時刻要從核心返回到該進程的使用者空間代碼繼續執行之前,首先處理PCB中記錄的訊號,
Time of Update: 2017-02-27
fork的作用是根據一個現有的進程複製出一個新進程,原來的進程稱為父進程(Parent Process),新進程稱為子進程(Child