android init.rc中service console option的含義、作用
void service_start(struct service *svc, const char *dynamic_args) needs_console = (svc->flags & SVC_CONSOLE) ? 1 : 0; /*如果是需要控制台環境但是沒有控制台,設置SVC_DISABLED標志位后返回*/ if (needs_console && (!have_console)) { ERROR("service '%s' requires console\n", svc->name); svc->flags |= SVC_DISABLED; return; } if (needs_console) { /* 使進程獨立開來,擺脫源會話、源進程組、源控制終端,使其成為一個新的進程組長 */ setsid(); open_console(); } else { zap_stdio(); }
一個會話單獨占據一個控制終端,不可能出現兩個會話同時共享一個控制終端。
這也是為什么 setsid()函數能擺脫控制終端的原因,因為,一個控制終端只能被一個會話所擁有,而,setsid()函數調用成功之后,會創建一個新的會話,因此這時,出現了倆個會話,而這倆個會話不可能同時
共用一個控制終端,所以,新創建的會話會自動脫離原來的控制終端。
會話 (session)
更進一步,在shell支持工作控制(job control)的前提下,多個進程組還可以構成一個會話 (session)。bash(Bourne-Again shell)支持工作控制,而sh(Bourne shell)並不支持。
會話是由其中的進程建立的,該進程叫做會話的領導進程(session leader)。會話領導進程的PID成為識別會話的SID(session ID)。會話中的每個進程組稱為一個工作(job)。會話可以有一個進程組成為會話的前台工作(foreground),而其他的進程組是后台工作(background)。每個會話可以連接一個控制終端(control terminal)。當控制終端有輸入輸出時,都傳遞給該會話的前台進程組。由終端產生的信號,比如CTRL+Z, CTRL+\,會傳遞到前台進程組。
會話的意義在於將多個工作囊括在一個終端,並取其中的一個工作作為前台,來直接接收該終端的輸入輸出以及終端信號。 其他工作在后台運行。