導航:首頁 > 網路營銷 > linux進程間semwait

linux進程間semwait

發布時間:2020-09-18 01:14:13

1、求高手,linux系統幾乎所有進程處於sleep狀態是否正常

你的sleep進程基本上都是java相關的。可能是由於某個進程長期得不到響應,比如nfs造成的IO中斷,應用一直在等待響應,等的都睡著了。。所以也看不到報錯,呵呵。具體的也看不出到底是哪個進程引起的。建議就是重啟相關的java應用。或者重啟機器。

進程為什麼會被置於uninterruptible sleep狀態呢?處於uninterruptible sleep狀態的進程通常是在等待IO,比如磁碟IO,網路IO,其他外設IO,如果進程正在等待的IO在較長的時間內都沒有響應,那麼就很會不幸地被 ps看到了,同時也就意味著很有可能有IO出了問題,可能是外設本身出了故障,也可能是比如掛載的遠程文件系統已經不可訪問了,我以前遇到的問題就是由 down掉的NFS伺服器引起的。
正是因為得不到IO的相應,進程才進入了uninterruptible sleep狀態,所以要想使進程從uninterruptible sleep狀態恢復,就得使進程等待的IO恢復,比如如果是因為從遠程掛載的NFS卷不可訪問導致進程進入uninterruptible sleep狀態的,那麼可以通過恢復該NFS卷的連接來使進程的IO請求得到滿足,除此之外,要想幹掉處在D狀態進程就只能重啟整個Linux系統了。

2、急!LINUX下,GCC編譯,原程序包含<semaphore.h>頭文件,為什麼編譯時說sem_wait,sem_post等未定義的引用

編譯時加上參數:-lpthread

要看報錯的階段,是在編譯還是鏈接階段.
如果編譯時函數沒有找到,那是頭文件的問題,如果鏈接時未定義引用,那是c庫的問題.
如果你的頭文件都正常包含了,那可能你的c庫沒有使能semaphore的支持.

3、linux進程間信號量的調試信號

命令 ipcs -s 可以顯示系統中現有的信號量組的相關信息。而 ipcrm sem 命令可以從命令行刪除一個信號量組。例如,要刪除標識符為5790517的信號量組則應運行以下命令:
% ipcrm sem 5790517

4、linux下 進程信號量和線程信號量的區別和聯系是什麼

信號量在進程是以有名信號量進行通信的,在線程是以無名信號進行通信的,因為線程linux還沒有實現進程間的通信,所以在sem_init的第二個參數要為0,而且在多線程間的同步是可以通過有名信號量也可通過無名信號,但是一般情況線程的同步是無名信號量,無名信號量使用簡單,而且sem_t存儲在進程空間中,有名信號量必須LINUX內核管理,由內核結構struct ipc_ids 存儲,是隨內核持續的,系統關閉,信號量則刪除,當然也可以顯示刪除,通過系統調用刪除,
消息隊列,信號量,內存共享,這幾個都是一樣的原理。,只不過信號量分為有名與無名

5、linux編程時的信號量問題。 我以前用過的信號量頭文件是<semaphore.h>,而現在又發現還有個<sys/sem.h>

信號量在進程是以有名信號量進行通信的,在線程是以無名信號進行通信的,因為線程linux還沒有實現進程間的通信,所以在sem_init的第二個參數要為0,而且在多線程間的同步是可以通過有名信號量也可通過無名信號,但是一般情況線程的同步是無名信號量,無名信號量使用簡單,而且sem_t存儲在進程空間中,有名信號量必須LINUX內核管理,由內核結構struct ipc_ids 存儲,是隨內核持續的,系統關閉,信號量則刪除,當然也可以顯示刪除,通過系統調用刪除,
消息隊列,信號量,內存共享,這幾個都是一樣的原理。,只不過信號量分為有名與無名

無名使用 <semaphore.h>,
有名信號量<sys/sem.h>
無名信號量不能用進程間通信,
//無名與有名的區別,有名需要KEY值與IPC標識
所以sem_init的第二個參數必須為0,,,,

6、linux 下進程間通過信號進行通信的具體實現過程

kill函數用來發送信號給指定的進程,在Shell下輸入man 2 kill可獲取其函數原型如下:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int sig);
該函數的行為與第一個參數pid的取值有關,第二個參數sig表示信號編號。
如果pid是正數,則發送信號sig給進程號為pid的進程;
如果pid為0,則發送信號sig給當前進程所屬進程組里的所有進程;
如果pid為-1,則把信號sig廣播至系統內除1號進程(init進程)和自身以外的所有進程;
如果pid是-1還小的負數,則發送信號sig給屬於進程組-pid的所有進程。
如果參數sig是0,則kill()仍執行正常的錯誤檢查,但不發送信號。可以利用這一點來確定某進程是否有權向另外一個進程發送信號。如果向一個並不存在的進程發送空信號,則kill()返回-1,errno則被設置為ESRCH。
函數執行成功返回0,當有錯誤發生時則返回-1,錯誤代碼存入errno中,詳細的錯誤代碼說明請參考man手冊。
注意:只有具有root許可權的進程才能向其他任一進程發送信號,非root許可權的進程只能向屬於同一個組或同一個用戶的進程發送信號。

更簡單的方法是通過進程名給進程發信號。比如你的進程名是 aproc,你自己定義一個信號量18,那麼:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char cmd[256]=""; int sig = 18;
char procname[]="aproc";
sprintf(cmd, "killall -%d %s\n", sig, procname);
system(cmd);
就能給特定進程發信號了

充分利用system函數,可以簡化很多編程工作量,比如查IP地址、查硬碟目錄、查磁碟空間等等,編程很麻煩的事都能用system處理,相當於在程序里調用SHELL

7、關於linux下的多線程使用sem信號量的運行問題

不是信號量的問題
printf函數,是先寫到輸出緩沖,遇到\n時,或者緩沖區滿時,或者有強制輸出(fflush)時,才會將緩沖區里的內容輸出到屏幕上(標准輸出設備:stdout)。你的代碼裡面並沒有以上3個觸發條件的任意一種,所以printf的內存沒有實際輸出到屏幕上。
你只要在每個printf函數後面加上fflush(stdout);就可以了。

8、Linux C 如何方便的實現進程間 wait / notify

有以下代碼:
int main(){
pid_t pid;
pid = fork();
if(pid == 0){
exit(3);
}
else if(pid > 0){
int num = 0;
wait(&num);
printf("%d\n",WIFEXITED(num));
}
return 0;
}
程序運行的結果為( )。
A 0 B 1 C 2 D 3

請說出解題思路,謝謝!

9、linux進程間信號量的等待投遞

每個信號量都具有一個非負的值,且信號量支持等待和投遞操作。系統調用 semop 實現了這兩個操作。它的第一個參數是信號量的標識符,第二個參數是一個包含 struct sembuf 類型元素的數組;這些元素指明了您希望執行的操作。第三個參數是這個數組的長度。結構體sembuf中包含如下欄位:
sem_num將要執行操作的信號量組中包含的信號量數量。 sem_op是一個指定了操作類型的整數。 如果sem_op是一個正整數,則這個值會立刻被加到信號量的值上。 [BR]如果 sem_op 為負,則將從信號量值中減去它的絕對值。如果這將使信號量的值小於零,則這個操作會導致進程阻塞,直到信號量的值至少等於操作值的絕對值(由其它進程增加它的值)。 [BR]如果 sem_op 為0,這個操作會導致進程阻塞,直到信號量的值為零才恢復。 sem_flg 是一個符號位。指定 IPC_NOWAIT 以防止操作阻塞;如果該操作本應阻塞,則semop調用會失敗。如果為sem_flg指定SEM_UNDO,Linux會在進程退出的時候自動撤銷該次操作。 代碼 5.4 展示了二元信號量的等待和投遞操作。
代碼 5.4 (sem_pv.c)二元信號量等待和投遞操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 等待一個二元信號量。阻塞直到信號量的值為正,然後將其減1 */
int binary_semaphore_wait (int semid)
{
struct sembuf operations[1];
/* 使用(且僅使用)第一個信號量 */
operations[0].sem_num = 0;
/* 減一。 */
operations[0].sem_op = -1;
/* 允許撤銷操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
/* 對一個二元信號量執行投遞操作:將其值加一。 這個操作會立即返回。*/
int binary_semaphore_post (int semid)
{
struct sembuf operations[1];
/* 使用(且僅使用)第一個信號量 */
operations[0].sem_num = 0;
/* 加一 */
operations[0].sem_op = 1;
/* 允許撤銷操作 */
operations[0].sem_flg = SEM_UNDO;
return semop (semid, operations, 1);
}
指定 SEM_UNDO 標志解決當出現一個進程仍然持有信號量資源時被終止這種特殊情況時可能出現的資源泄漏問題。當一個進程被有意識或者無意識地結束的時候,信號量的值會被調整到「撤銷」了所有該進程執行過的操作後的狀態。例如,如果一個進程在被殺死之前減小了一個信號量的值,則該信號量的值會增長。

與linux進程間semwait相關的知識