• Tidak ada hasil yang ditemukan

Pengawasan Proses

Dalam dokumen Buku bhs pemrograman Q Equational 2018 (Halaman 178-182)

10 fungsi Built-In

11. Pustaka Standar

12.7 Pengawasan Proses

Fungsi sistem mengembalikan kode status dari perintah jika eksekusi sukses, dan gagal dengan cara lainnya:

public extern system CMD; // exec command using the shell

Clib juga menyediakan proses UNIX yang umum seperti rutinitas-rutinitas pembuatan dan manajemen. Kebanyakan benar-benar memerlukan suatu sistem UNIX; tidak ada usaha yang dibuat untuk menandingi operasi seperti garpu di sistem di mana mereka tidak diterapkan. Dengan demikian satu-satunya operasi proses yang sekarang ini bekerja di bawah Windows adalah sistem, exec, spawn, _ spawn, exit dan getpid.

public extern fork; // fork a child process (U) public extern exec PROG ARGS; // execute program

public extern spawn PROG ARGS; // execute program in child process public extern _spawn MODE PROG ARGS; // execute child with options public extern nice INC; // change nice value (U)

public extern exit N; // exit process with given exit code public extern pause; // pause until a signal occurs (U) public extern raise SIG; // raise signal in current process public extern kill SIG PID; // send signal to given process (U) public extern getpid; // current process id

public extern getppid; // parent's process id (U) public extern wait; // wait for any child process (U) public extern waitpid PID OPTIONS; // wait for given child process (U)

Semua operasi ini hanyalah pembungkus untuk rutin pustaka C yang sesuai. Catatan, bagaimanapun, bahwa fungsi pemangsa mengambil isyarat itu untuk mengirim sebagai argument pertama, yang membuatnya lebih mudah untuk menggunakan fungsi di suatu bentuk yang dirapikan, misalnya, untuk mengulangi suatu operasi pemangsa setelah daftar angka-angka proses (seperti di `do (kill SIGTERM) PIDs').

Fungsi exec melaksanakan suatu pencarian alur seperti fungsi execlp/execvp di C; parameter- parameter untuk program itu diberi sebagai suatu daftar string ARGS, dan seperti biasanya argument yang pertama perlu mengulangi nama file program. Fungsi ini tidak pernah

dikembalikan kecuali jika itu gagal. operasi spawn dan _spawn disediakan untuk mengakomodasi Windows dari ketiadaan garpu dan waktu tunggu; fungsi-fungsi ini bekerja di UNIX dan Windows. Fungsi spawn bekerja seperti exec, tetapi program berjalan di suatu proses anak yang baru. Itu mengembalikan suatu id proses yang baru (sebenarnya proses menangani di bawah Windows). fungsi _spawn seperti spawn, tetapi menerima satu parameter MODE tambahan yang menentukan bagaimana proses anak itu dieksekusi, yang manapun P_WAIT (nantikan proses anak, mengembalikan setatus exitnya), P_NOWAIT (jangan menantikan anak, sama seperti spawn), P_OVERLAY (gantikan gambaran yang ada dengan proses yang baru, sama seperti exec) dan P_DETACH (menjalankan proses baru di dalam latar belakang). (Catatan bahwa pilihan P_DETACH diabaikan di sistem UNIX; cara yang benar untuk mengkode suatu "daemon" di UNIX ditunjukkan di dalam bagian contoh-contoh yang ada di bawah.)

Di UNIX, rutinitas-rutinitas yang berikut disediakan untuk menterjemahkan kode status yang dikembalikan oleh sistem, _ spawn, fungsi wait dan waitpid :

public extern isactive STATUS; // proses aktif

public extern isexited STATUS, exitstatus STATUS;

// proses sudah berjalan secara normal, mendapat kode keluarnya public extern issignaled STATUS, termsig STATUS;

// proses diakhiri oleh tandat, dapatkan nomor tanda public extern isstopped STATUS, stopsig STATUS;

// proses dihentikan oleh tanda, dapatkan nomor tanda

Untuk informasi lebih lanjut tentang fungsi proses, kita menunjukkan pembaca kepada halaman-halaman manual UNIX yang sesuai.

Operasi untuk mengakses lingkungan proses juga diterapkan. Fungsi getenv gagal jika variabel yang diberi bukanlah yang ditetapkan dalam lingkungan; hal ini memungkinkan anda mencirikan kondisi error ini dari suatu variabel yang digambarkan dengan nilai yang kosong. Fungsi setenv menulis berlebihan satu definisi yang ada variabel yang diberi:

public extern getenv NAME, setenv NAME VAL; // dapatkan/atur variabel-variabel lingkungan

Di UNIX, operasi yang berikut menyediakan akses untuk memproses informasi pengguna dan kelompok, seperti juga proses menggolongkan dan sesi-sesi. Tidak semua operasi bisa diterapkan di semua tipe UNIX. tolong lihat manual UNIX untuk suatu uraian fungsi-fungsi ini.

/* fungsi-fungsi User/group-related (U). */

public extern setuid UID, setgid GID; // set user/group id of process public extern seteuid UID, setegid GID; // set effective user/group id public extern setreuid RUID EUID, setregid RGID EGID;

// menetapkan ids yang efektif dan riil

public extern getuid, geteuid; // get real/effective user id public extern getgid, getegid; // get real/effective group id public extern getlogin; // get real login name

// dapatkan/atur kelompok ids pengganti dari proses yang sedang berjalan public extern getgroups, setgroups GIDS;

/* Rutinitas-rutinitas terkait dengan sesi (U). */

public extern getpgid PID, setpgid PID PGID; // get and set process group public extern getpgrp, setpgrp; // dito, for calling process public extern getsid PID; // get session id of process public extern setsid; // create a new session

Contoh-contoh

meminta fungsi sistem untuk melaksanakan suatu perintah shell:

==> system "ls -l"

Anda dapat juga menjalankan program secara langsung dengan fungsi spawn:

==> spawn "ls" ["ls","-l"]Get and set an environment variable: ==> getenv "HOME"

"/home/ag"

==> getenv "MYVAR" // variable is undefined getenv "MYVAR"

==> setenv "MYVAR" "foo bar" ()

==> getenv "MYVAR" "foo bar"

Di sini ada beberapa contoh memperlihatkan pemakaian pipa-pipa yang dinamai dan fungsi proses di sistem UNIX. Fungsi mkfifo mengizinkan pembuatan yang disebut "file-file FIFO khusus" a.k.a. pipa-pipa yang dinamai, yang menyediakan suatu fasilitas komunikasi antar proses yang sederhana.

Sebagai contoh, membuat suatu pipa yang dinamai sebagai berikut:

==> mkfifo "pipe" 0666 ()

Anda kemudian bisa membuka sesuatu yang bisa ditulisi di akhir pipa:

Catatan bahwa blok panggilan ini sampai sisi masukan dari pipa sudah dibuka. Untuk tujuan ini, kejadian awal lain dari interpreter (misalnya, di dalam xterm yang lain), dan dari sana buka pipa untuk membaca:

==> def IN = fopen "pipe" "r"

Kedua pemanggilan fopen sekarang sudah diselesaikan, dan anda dapat menulis sesuatu kepada keluaran akhir dari pipa sebelumnya dari interpreter:

==> fwrites OUT "Hello, there!\n"

Pergi ke kejadian interpreter yang lain, dan baca kembali string dari sana:

==> freads IN "Hello, there!"

Seperti biasanya, masing-masing akhir dari pipa itu tertutup secepat obyek file yang sesuai sudah tidak dapat lagi diakses. Ketika anda menutup yang bisa menulis di akhir dari pipa yang menggunakan, misalnya, undef OUT sebelumnya dari interpreter, sisi masukan dari pipa itu akan daerah end-of-file, dan seperti itu feof IN akan jadi benar. Setelah penutupan pipa juga di sisi masukan, anda dapat mencabut file FIFO khusus dengan melepaskan fungsi.

Anda dapat juga menggunakan pipa-pipa yang dinamai untuk membuat suatu kanal komunikasi kepada anak proses yang diciptakan dengan garpu. Sebagai contoh:

def NAME = tmpnam;

def PIPE = mkfifo NAME 0666; def MSG = "Hello there!\n";

test = printf "Parent writes: %s" MSG || fwrites (fopen NAME "w") MSG ||

writes "Parent waits for child ...\n" ||

printf "Parent: child has exited with code %d\n" wait if fork > 0;

= printf "Child reads: %s\n" (freads (fopen NAME "r")) || writes "Child exiting ...\n" || exit 0

otherwise; ==> test

Parent writes: Hello there! Parent waits for child ... Child reads: Hello there! Child exiting ...

Parent: child has exited with code 0 ()

==> unlink NAME ()

Metoda lain untuk memenuhi hal ini dengan pipa-pipa yang tanpa nama dibahas di Low-Level I/O.

Di UNIX, itu juga mungkin untuk menerapkan "daemons", yaitu., proses-proses yang menempatkan diri mereka di dalam latar belakang dan terus berjalan bahkan ketika anda ke luar. Script kecil berikut menunjukkan bagaimana melakukan hal ini.

/* Menjadi suatu daemon adalah gampang: Hanya bercabang dua, mempunyai induk pergi, dan memanggil setsid yang ada di dalam anak untuk mulai suatu sesi yang baru. Proses yang baru menjadi suatu anak dari init proses dan tidak memiliki terminal pengendalian. Dengan demikian terus menjalankan sekali pun anda ke luar, sampai itu ditutup atau sistem ditutup. */

daemon = setsid || main if fork = 0; = exit 0 otherwise;

/* Kode utama dari daemon lalu menutup file descriptors menerima warisan oleh induk dan memulai melaksanakan. Di dalam contoh ini, kita hanya membuka suatu logfile dan memulai pesan-pesan pembukaan di dalam interval yang reguler. Kita juga menangani kondisi bahwa kita diakhiri oleh suatu isyarat. */

main = do close [0,1,2] || log F "daemon started" || do (trap 1) [SIGINT, SIGTERM, SIGHUP, SIGQUIT] || catch (sig F) (loop F) where F:File = fopen "log" "w"; = perror "daemon" || exit 1 otherwise;

sig F (syserr SIG)

= log F (sprintf "daemon stopped by signal %d" (-SIG)) || exit 0;

loop F = sleep 5 || log F "daemon still alive" || loop F; log F MSG = fprintf F "%s at %s" (MSG, ctime time) || fflush F;

Dalam dokumen Buku bhs pemrograman Q Equational 2018 (Halaman 178-182)