日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

会话(session)

發布時間:2023/11/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 会话(session) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一組進程形成一個進程組,一組進程組形成一個會話,即一個會話中可以包括多個進程組。

1)創建會話

創建一個會話需要注意以下6點注意事項:1.調用進程不能是進程組組長(不能是父進程),該進程變成新會話首進程(session header) ,若調用進程是組長進程,則出錯返回;2.該進程成為一個新進程組的組長進程;3.需有root權限(ubuntu不需要);4.新會話丟棄原有的控制終端,該會話沒有控制終端;5.建立新會話時,先調用fork,父進程終止,子進程調用setsid。

2getsid函數

作用:獲取進程所屬的會話ID。

pid_t getsid(pid_t pid); 成功:返回調用進程的會話ID;失敗:-1,設置errno

pid為0表示查看當前進程session ID

ps ajx命令查看系統中的進程。參數a表示不僅列當前用戶的進程,也列出所有其他用戶的進程,參數x表示不僅列有控制終端的進程,也列出所有無控制終端的進程,參數j表示列出與作業控制相關的信息。

組長進程不能成為新會話首進程,新會話首進程必定會成為組長進程。

3setsid函數

創建一個會話,并以自己的ID設置進程組ID,同時也是新會話的ID

pid_t setsid(void);? 成功:返回調用進程的會話ID;失敗:-1,設置errno

調用了setsid函數的進程,既是新的會長,也是新的組長。

//fork一個子進程,并使其創建一個新會話。查看進程組ID、會話ID前后變化????

#include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(void) {pid_t pid;if ((pid = fork())<0) {perror("fork");exit(1);} else if (pid == 0) {printf("child process PID is %d\n", getpid());printf("Group ID of child is %d\n", getpgid(0));printf("Session ID of child is %d\n", getsid(0));sleep(10);setsid(); //子進程非組長進程,故其成為新會話首進程,且成為組長進程。該進程組id即為會話進程printf("Changed:\n");printf("child process PID is %d\n", getpid());printf("Group ID of child is %d\n", getpgid(0));printf("Session ID of child is %d\n", getsid(0));sleep(20);exit(0);}return 0; }

[root@localhost 01_session_daemon_test]# ./session

child process PID is 20303

Group ID of child is 20302

Session ID of child is 12137

[root@localhost 01_session_daemon_test]# Changed:

child process PID is 20303

Group ID of child is 20303

Session ID of child is 20303

[root@localhost 01_session_daemon_test]# ps ajx

PPID??? PID?? PGID??? SID TTY?????? TPGID STAT?? UID?? TIME COMMAND

12131? 12137? 12137? 12137 pts/2???? 20436 Ss?????? 0?? 0:01 -bash

分析:可以看出shell進程(pts/2設備終端進程,init進程fork、exec后形成)的進程ID為12137,進程組ID為12137,會話ID為12137;shell進程fork后的子進程exec去執行上面的程序./session,即父進程。此時父進程的進程組ID為12137,會話ID為12137;父進程fork后產生了子進程,此時父進程與子進程成立一個進程組,因此父進程的組ID在fork后立即變為自己進程ID,即為20302;生成的子進程組ID即為其父進程ID,會話ID仍然不變,為12137。至此會話12137里面包含了兩個進程組,一個為shell進程,另一個為父子進程。子進程通過函數setsid( )創建會話,則該子進程的會話ID發生變化(新的會話),進一步導致該進程成為了一個新的進程組組長,其進程組組ID也變為了自己進程ID,同時該子進程(新創建的會話)沒有控制終端。

總結

以上是生活随笔為你收集整理的会话(session)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。