Boot Process
BSD Terminal Logins
/etc/ttys 檔案中對每個 terminal device 都有一行對應的設定,包括 device name 和相關參數這些設定會傳送給 getty 這隻程式/etc/ttys,並對於每個允許的 login terminal 執行 fork,並跑 exec 執行 gettyinit execute getty program with empty environmentgetty 呼叫 open 來開啟 terminal device 進行讀寫, file descriptor 0,1,2 被配置在 device 上getty 會產生輸出如 login: 並等待 user name 輸入getty 執行 login 如下execle("/bin/login", "login", "-p", username, (char *)0, envp);
init 時 environment 是空的,getty 在這邊會為 login 產生 envirement(envp argemnet), -p flag 用來告訴 login 保留傳遞過去的 enviromentlogin 接下來會getpwnam 取得 user's password file entrygetpass 顯示 Password: 提示使用者輸入,並讀取輸入的密碼crypt 來加密使用者輸入的密碼,和從 password file entry 中的 pw_passwd 欄位做比對login 會呼叫 exit 帶參數 1,這個 terminate 會通知給 parent(init),parent 會再做一次 fork、exec、getty 對這個 terminal 重複一次上述流程login 會setgid 和 initgroups,設定我們的 group idexecl("/bin/sh", "-sh", (char *)0);
login 可選擇印出 message-of-the-day(motd),check new mail 或執行其他工作BSD Network Logins
inted 這隻 process 會等待處理大多數的網路連線init 會調用一個 shell 來執行 /etc/rc 這個 shell script,他會啟動 inetd 和其他 daemon,當 /etc/rc 結束後,inetd 的 parent會變成 initinetd 會等待 TCP/IP 連線,當有連線請求時,inetd 會 fork,並 exec 執行對應的程式inetd 收到連線請求後(以 telnet 為例)loginprocess group
pid_t type 儲存#include <unistd.h> pid_t getpgrp(void); /* Returns: process group ID of calling process */ pid_t getpgid(pid_t pid); /* Returns: process group ID if OK, −1 on error */
process group lifetime
create or join a process group
#include <unistd.h> int setpgid(pid_t pid, pid_t pgid); /* Returns: 0 if OK, −1 on error */
Session
proc1 | proc2 & proc3 | proc4 | proc5
create a session
#include <unistd.h> pid_t setsid(void); /* Returns: process group ID if OK, −1 on error */
get the current session id
#include <unistd.h> pid_t getsid(pid_t pid); /* Returns: session leader’s process group ID if OK, −1 on error */
controlling terminal
tcgetpgrp, tcsetpgrp and tcgetsid function
#include <unistd.h> pid_t tcgetpgrp(int fd); /* Returns: process group ID of foreground process group if OK, −1 on error */ int tcsetpgrp(int fd, pid_t pgrpid); /* Returns: 0 if OK, −1 on error */
tcgetpgrp returns the process group ID of the foreground process group associated with the terminal open on fd.tcsetpgrp 來將 foreground process group id 設成 pgrpid#include <termios.h> pid_t tcgetsid(int fd); /* Returns: session leader’s process group ID if OK, −1 on error */
tcgetsid 來取得此 controlling terminal 的 session leader 的 sidjob control
cat > test.tmp & 在 background 就會 stop,直到使用 fg 將 process 帶回到 foreground ,process才會收到 SIGCONT signal 繼續讀取使用者輸入stty tostop 可以 disable background output$ ps -o pid,ppid,pgid,sid,comm | cat1 | cat2 PID PPID PGID SID COMMAND 949 947 949 949 sh 1988 949 949 949 cat2 1989 1988 949 949 ps 1990 1988 949 949 cat1
orphaned process group
setsid 被呼叫時,新的 session structure 被配置在 kernel 中