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會變成 init
inetd
會等待 TCP/IP 連線,當有連線請求時,inetd
會 fork,並 exec 執行對應的程式inetd
收到連線請求後(以 telnet 為例)login
process 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 中