蘋果小豬研究室
  • 首頁
  • 中譯資料
  • 網路觀念
    • OSGi 平台
    • SCTP 通訊協定簡介
      • 1 多重串流 (Multi-streaming)
      • 2 路徑多宿 (Multi-homing)
      • 3 SACK 機制
      • 4 Path MTU Discovery
      • 5 Ordered/Unordered 傳送機制
      • 6. SCTP API
      • 7. TCP 與 SCTP 通訊協定比較
      • 8. 參考文獻
    • TCP over SCTP tunnel
    • TCP 與 SCTP 協定轉換機制
    • UPnP 與 UPnP AV
  • Linux 程式設計
    • [C] 產生亂數
    • [C] Pointer and array
    • [Script] strncmp
    • [C] Linux 取得 HD 序號
    • [C] 程式範例-切割 subnet
    • C struct 的使用
    • C 目錄相關
    • const 修飾詞
    • Dangling pointer(懸置指標)
    • dnsmole
    • dos2unix 程式碼
    • Function pointer in C
    • GCC header limits.h
    • GDB 參數
    • glibc detected (double free)
    • IEEE 754 and float 範例程式
    • kernel 中的網路卡名稱與命名順序關係
    • Linux 序列埠程式設計
    • loop device 的數目
    • Perl & LWP
    • Remote Control over CGI
    • 偵測 NAT 內部主機連線狀況
    • 利用 libpcap 取得所有的網路裝置名稱
    • 取得時間
    • strncpy
    • 從應用層程式取得傳輸層 TCP 資訊
    • 於 Linux 上撰寫 daemon server 要注意的
    • 為什麼需要 & 0377
    • 研究 setsid()
    • 與 HTTP 協定有關的 RFC
    • 製作 patch 檔
    • 設計在背景執行的 Linux 程式
    • 讀取 STDIN (Standard INPUT) 範例程式
    • 關於 Linux CPU smp_affinity
    • 陣列名稱與指標
  • 網路服務推薦
    • 專案管理工具 - clickup
    • 文件大師 - gitbook
  • glibc 中文手冊
    • GNU C 函式庫常見問題(FAQ)
  • Linux 系統操作
    • /proc/sys/net/ipv4/conf/eth* 目錄中的參數
    • Linux 伺服器效能調校
    • Linux 設定網卡速度
    • Proxy ARP
    • sysrq
    • Turn off beep in Linux system
    • umask()
    • 以 ethtool 查看網路卡狀態及設定
    • 使用 nameif 修改 Linux 網路卡名稱
    • 使用 xhost
    • 利用 sed 取出檔案中某行
    • 在 bash 中設定 Proxy server
    • 在 Linux 系統呈現 dd 的進度
    • 字串取代,使用 awk & sed
    • 尋找多種副檔名
    • 常用 VIM 選項
    • 自動 CPU 調頻節能控制
    • 自動執行程式
    • 設定 Debian 預設啟動服務
    • 設定 DHCPd server
    • 透過 RS-232 操作 Linux console
    • Linux connect to serial port
  • 資訊安全
    • ARP spoofing 技術管控區網流量實例
    • dsniff
    • Linux Socket Filtering
    • Linux 系統安全管理
    • Security 資訊
    • sniffer 相關工具 - IPgrad, tcpick
    • 以 Linux 實務 ARP Spoofing
    • 將文字隱藏於 JPEG 圖檔
    • 資安工具
    • 資安相關網站
    • 限制 localhost 的 P2P 上傳流量
  • 實用工具
    • 實驗基本數據製圖指令 gnuplot
  • 交換連結
  • 網頁設定
  • 網路應用
    • 網路時光機
  • Foldng@Home
  • 文獻推薦
    • 電子書
    • 提問的智慧
    • 好書
  • 隱私政策
Powered by GitBook
On this page
Edit on GitHub
  1. Linux 程式設計

研究 setsid()

假設我們一開始建立了一個行程(process),那麼該行程若以 fork()複製出一個相同的行程,稱之為子行程(child proccess),而產生子行程的行程則稱為父行程(parent process),這是行程之間的父子關係。 最早的父行程具有行程領導者(process leader)的地位,行程領導者的 PID (Process ID)就是該行程家族群組的群組 ID (group ID)。總之,只要都是最早的父行程或其後代所產生的子行程都會繼承相同的群組 ID,而 Linux kernel 會根據該群組 ID,將訊號送給各行程群組。 - system call

getpgid() 與 getpgrp():取得該行程的群組 ID getpid(): 取得該行程的 PID getppid(): 取得該行程之父行程的 PID setpgid(): 將指定的 PID 設定為該行程的群組 ID,若 PID 為 0,則使用該行程 PID。 setsid(): 將該行程設定為 session leader 與行程領導者。 getsid()

/* man 2 setsid for details */

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    if(fork()>0) {
      printf("p getpid: %d\n", getpid());
      printf("p geppid: %d\n", getppid());
      printf("p getpgrp: %d\n", getpgrp());
      printf("p setsid: %d\n", setsid());
      printf("p getpgrp: %d\n", getpgrp());
      printf("p geppid: %d\n", getppid());
    } else {
      printf("gepid: %d\n", getpid());
      printf("geppid: %d\n", getppid());
      printf("getpgrp: %d\n", getpgrp());
      printf("setsid: %d\n", setsid());
      printf("getpgrp: %d\n", getpgrp());
      printf("geppid: %d\n", getppid());
    }

      return 0;
}  

# gcc test.c -o test

# ./test gepid: 3899 geppid: 3898 getpgrp: 3898 <----- setsid: 3899 getpgrp: 3899 <----- geppid: 3898 p getpid: 3898 <----- p geppid: 3697 p getpgrp: 3898 p setsid: -1 p getpgrp: 3898 p geppid: 3697

由結果觀察到,經過 setsid 之後的子行程已經自己成家立業,有自己的行程群組,而不再與原本的父行程同一個行程群組。 PS: 這裡所謂的行程群組與行程所屬的使用者群組是不一樣。 參考文獻 John Shapley Gray, Interprocess Communications in Linux: The Nooks and Crannies, Chapter 2, 2003.

Previous為什麼需要 & 0377Next與 HTTP 協定有關的 RFC

Last updated 2 years ago