程序執行緒問題總結

2021-09-25 20:56:15 字數 1745 閱讀 3048

#include

#include

#include

#include

intmain()

case-1

:perror

("process creation failed\n");

exit(-

1);default

:printf

("i am parent process, my pid is %d \n"

,getpid()

);//輸出父程序的id

exit(0

);}return0;

}

首先說一下init的id為啥是1.idle程序id為0,其前身是系統建立的第1個程序,idle通過kernel_thread建立了兩個核心執行緒,其中乙個就是kernel_init(核心態),程序id為1.然後1號核心程序(kernel_init)呼叫init函式並演化成1號使用者程序(init)。

因為ubuntu是使用system來管理系統的發行版,systemd的原始碼中呼叫了prctl(pr_set_child_subreaper,1)系統呼叫,這個函式的作用就是讓當前程序像init程序一樣收養孤兒程序,所以在圖形介面下孤兒程序的ppid為systemd的程序號。但我在deepin的圖形介面下卻沒有遇到這個問題。

#include

#include

#include

#include

#include

#include

#include

#include

#include

intinit_daemon()

intmain

(int argc,

char

*ar**)

return0;

}

下面是我的理解:

第一次fork退出是為了讓子程序成為孤兒程序並且保證子程序不是會話組組長(程序id和程序組id相同的程序),這樣才能呼叫setsid函式來脫離所有終端。但呼叫setsid後程序會成為會話組組長,那麼這個程序就可以重新申請開啟乙個終端,這時候就需要再fork一次,將呼叫fork的程序退出,保證子程序不是程序組長,這樣就不能重新開啟乙個終端了。

pthread_mutex_lock(&

(pool-lpthread>mutex));

// 若等待隊列為 0 則處於阻塞狀態

while

(pool-lpthread>cur_tasks ==0&&

!pool-lpthread>stop)

假設任務a給向等待這的b發出signal並解鎖,b進入到判斷等待佇列是否為0,然後進入pthread_cond_wait函式,wait函式先解鎖,然後再接受訊號,最後再加鎖。如果在b的wait函式剛解開鎖之後,c跑去執行pthread_cond_wait函式,然後從b**搶到了a發出的signal,接著將這個任務執行掉。而b在沒接受到訊號後,如果這個時候是if的話,它就會接著去執行下邊的**,這樣就會使程式出錯,如果是while迴圈的話,它接寫來會去判斷任務佇列是否為0,接著就會繼續阻塞著等待下乙個signal。所以這裡必須用while。

程序 執行緒 多執行緒相關總結

一 說說概念 1 程序 process 狹義定義 程序就是一段程式的執行過程。廣義定義 程序是乙個程式關於某個資料集合的一次執行。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。簡單的來講程序的概念主要有兩點 第一,程序是乙個實體。每乙個程序都有它自己...

程序,執行緒 相關問題

建立程序 wchar cmdexe max path stprintf cmdexe,t s s c e,csparam cmd c s s startupinfo si process information pi si.dwflags startf useshowwindow 指定wshowwi...

程序及執行緒通訊總結

上文我們介紹了如何建立乙個簡單的多執行緒程式,多執行緒之間不可避免的需要進行通訊 相比於程序間通訊來說,執行緒間通訊無疑是相對比較簡單的。首先我們來看看最簡單的方法,那就是使用全域性變數 靜態變數也可以 來進行通訊,由於屬於同乙個程序的各個執行緒是處於同乙個程序空間中的,並且它們共享這個程序的各種資...