Jawaban:
Di Linux, setiap proses memiliki beberapa ID yang terkait dengannya, termasuk:
ID Proses (PID)
Ini adalah nomor arbitrer yang mengidentifikasi proses. Setiap proses memiliki ID unik, tetapi setelah proses keluar dan proses induk mengambil status keluar, ID proses dibebaskan untuk digunakan kembali oleh proses baru.
ID Proses Induk (PPID)
Ini hanya PID dari proses yang memulai proses tersebut.
ID Grup Proses (PGID)
Ini hanya PID dari pemimpin grup proses. Jika PID == PGID, maka proses ini adalah pemimpin grup proses.
ID Sesi (SID)
Ini hanya PID dari pemimpin sesi. Jika PID == SID, maka proses ini adalah pemimpin sesi.
Sesi dan kelompok proses hanyalah cara untuk memperlakukan sejumlah proses terkait sebagai satu unit. Semua anggota grup proses selalu menjadi bagian dari sesi yang sama, tetapi sesi mungkin memiliki beberapa grup proses.
Biasanya, shell akan menjadi pemimpin sesi, dan setiap pipa yang dieksekusi oleh shell itu akan menjadi grup proses. Ini untuk memudahkan membunuh anak-anak dari kerang ketika keluar. (Lihat pintu keluar (3) untuk detail berdarah.)
Saya tidak berpikir ada istilah khusus untuk anggota sesi atau kelompok proses yang bukan pemimpin.
Pemimpin sesi adalah proses di mana id sesi == proses id. Ini terdengar dibuat-buat, tetapi id sesi diwarisi oleh proses anak. Beberapa operasi dalam UNIX / Linux beroperasi pada sesi proses, misalnya, meniadakan id proses ketika mengirim ke panggilan sistem atau perintah kill. Penggunaan paling umum untuk ini adalah ketika keluar dari shell. OS akan mengirim kill -HUP -$$
, yang akan mengirim sinyal SIGHUP (hangup) ke semua proses dengan id sesi yang sama dengan shell. Ketika Anda menolak suatu proses, id sesi proses diubah dari shell, sehingga tidak akan menanggapi sinyal hangup. Ini adalah salah satu bagian dari proses untuk menjadi proses daemon.
Sebagian besar proses yang dipanggil dari window manager / environment grafis memiliki id sesi yang sama dengan salah satu program startup. Ini memungkinkan OS untuk melakukan kill -HUP -$$
operasi yang sama pada semua program: seperti browser Anda, pemutar musik, libreoffice, klien IM, dll. Ini adalah proses yang bukan pemimpin sesi.
Saya pikir saya tahu jawabannya, tapi saya menulis sebuah program C untuk mencari tahu.
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t sid, mypid, pgid, gid;
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
if (!fork())
{
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("child PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
_exit(0);
}
return 0;
}
Saya mengkompilasikannya dengan cc -g -o sid sid.c
saya menjalankannya beberapa cara berbeda, untuk melihat apa yang terjadi:
./sid
nohup ./sid > sid.out
setsid ./sid
Saya agak terkejut dengan apa yang diberikan Linux (2.6.39) kembali. Saya juga menemukan halaman manual bagian 7, "kredensial".
Saran saya adalah melakukan man 7 credentials
(atau yang setara jika tidak di Linux), dan baca bagian tentang grup proses dan sesi untuk melihat apakah Anda dapat memecahkannya.
./sid
dan nohup ./sid
, dan ketika Anda menjalankan setsid ./sid
, id sesi (SID) adalah merek baru dan sama dengan proses PID ... I ' Saya tidak yakin mengapa nohup mencegah garpu (atau tampaknya), tapi saya pikir saya punya ide umum ...
ps xao pid,ppid,pgid,sid,comm
untuk melihat ID ini.