Apa maksud Anda "memulai proses dalam grup prosesnya sendiri"? Shell meluncurkan proses dalam grup prosesnya sendiri, begitulah cara kerjanya mengontrol (dengan memiliki grup proses untuk proses di latar depan, dan beberapa grup proses untuk setiap pipeline yang diluncurkan di latar belakang).
Untuk melihat bahwa shell meluncurkan grup proses baru untuk setiap pipeline, Anda dapat melakukan ini:
ps fax -o pid,pgid,cmd | less
yang akan menampilkan sesuatu seperti:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
Perhatikan bahwa shell telah membuat grup proses baru untuk pipeline, dan setiap proses dalam pipeline membagikan grup proses tersebut.
Sunting:
Saya pikir saya tahu apa yang Anda maksud. Anda memanggil system
dari Perl. Rupanya, sh -c
tidak membuat grup proses baru, karena merupakan shell tanpa kontrol tugas.
Apa yang akan saya lakukan adalah fork
, lalu pada anak:
setpgrp;
system("ps fax -o pid,pgid,cmd");
dan wait
pada orang tua.
EDIT:Jika yang ingin Anda lakukan adalah menggunakan setsid tetapi temukan id sesi dan/atau pid dari proses yang dihasilkan:
Jika Anda meluncurkan proses melalui perintah setsid, itu tidak akan dilampirkan ke terminal Anda, jadi tentu saja itu tidak akan merespons ctrl-c.
Anda dapat menemukannya dengan melihat melalui keluaran
ps x -O sid
atau sesuatu yang lebih terbatas seperti
ps x -o %c,%p,sid
Atau trolling sederhana melalui proc/[pid]/stat untuk semua entri dan melihat id sesi dan apa pun yang menarik (lihat man proc untuk detailnya)
Halaman manual untuk setsid tidak memberikan flag apa pun untuk menghasilkan keluaran secara langsung, tetapi Anda dapat dengan mudah membuat versi Anda sendiri yang mencetak informasi yang diinginkan, dengan memodifikasi standar.
Misalnya, ambil salinan setsid.c dari salah satu hasil untuk
http://www.google.com/codesearch?as_q=setsid&as_package=util-linux
Komentari nls termasuk, hal-hal lokal dan makro kesalahan _("") yang akan menyebabkan masalah dan kemudian tambahkan ini tepat sebelum baris execvp:
printf("process will be pid %d sid %d\n", getpid(), getsid(0));