android init.rc中service console option的含義、作用


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+\,會傳遞到前台進程組。

會話的意義在於將多個工作囊括在一個終端,並取其中的一個工作作為前台,來直接接收該終端的輸入輸出以及終端信號。 其他工作在后台運行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM