Fungsi-fungsi
exec family berperan dalam menggantikan proses yang sedang berjalan saat ini dengan proses baru pada bahasa pemrograman C. Fungsi tersebut dapat digunakan untuk menjalankan program bahasa C dengan menggunakan program bahasa C lainnya. Fungsi ini digunakan menggunakan
file header unistd.h. Terdapat banyak anggota dari
exec family yang diperlihatkan sebagai berikut.
satu, execvp: dengan menggunakan perintah ini, maka akan diciptakan child proses yang tidak perlu menjalankan program yang sama sebagai parent process. Pemanggilan sistem tipe exec memungkinkan sebuah proses untuk menjalankan program file apapun, termasuk sebuah binary executable atau sebuah skrip shell.
Sintak: int execvp (const char *file, char *const argv[]);
file: titik dari nama file yang berasosiasi dengan file yang akan dieksekusi.
argv: adalah sebuah null yang mematikan array dari pointer karakter.
Perhatikan contoh kecil untuk menampilkan bagaimana fungsi execvp() digunakan pada bahasa C. Terdapat dua file .c, EXEC.c dan execDemo.c, dimana execDemo.c akan mengganti EXEC.c dengan memanggil fungsi execvp() pada execDemo.c.
Contoh:
// EXEC.c
#include<stdio.h>
#include<unistd.h>
int main()
{
int i;
printf("Program EXEC.c yang"
" dipanggil oleh execvp()");
printf("\n");
return 0;
}
Selanjutnya dapatkan file executable dari EXEC.c menggunakan perintah
gcc EXEC.c -o EXEC
Contoh:
// execDemo.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
// Null mematikan array dari
// karakter pointer.
char *args[]={"./EXEC",NULL};
execvp(args[0],args);
// Semua statement akan
// diabaikan setelah fungsi
// execvp() dipanggil, dan
// proses process (execDemo.c)
// akan digantikan oleh proses
// (EXEC.c).
printf("Ending-----");
return 0;
}
Selanjutnya, ciptakan file executable dari execDemo.c menggunakan perintah:
gcc execDemo.c -o execDemo
Setelah menjalankan file executable dari execDemo.c dengan menggunakan perinah ./excDemo, maka didapatkan output sebagai berikut:
Program EXEC.c yang dipanggil oleh execvp()
Ketika file execDemo.c dikompilasi, selama statement execvp(args[0],args) dieksekusi, maka program akan digantikan dengan program EXEC.c. "Ending-----" tidak akan ditampilkan dilayar selama fungsi execvp() tetap dipanggil, program tersebut akan digantikan oleh program EXEC.c.
dua, execv: hal ini hampir sama dengan fungsi execvp() dalam hal sintak. Diaman sintak dari execv() diperlihatkan sebagai berikut:
int execv(const char *path, char *const argv[]);
path: menunjuk ke jalur dari file yang akan dieksekusi.
argv[]: adalah null yang mematikan array dari pointer karakter.
Perhatikan contoh kecil bagaimana fungsi execv() digunakan pada bahasa C. Contoh ini sama dengan contoh yang diperlihatkan sebelumnya untuk execvp(), dimana akan disediakan dua file EXEC.c dan execDemo.c dan execDemo.c yang akan digunakan untuk mengganti EXEC.c dengan cara memanggil fungsi execv() pada execDemo.c.
Contoh:
//Program EXEC.c pada bahasa C
#include<stdio.h>
#include<unistd.h>
int main()
{
int i;
printf("Program EXEC.c yang"
" dipanggil oleh execv() ");
printf("\n");
return 0;
}
Sekarang ciptakan file executable dari EXEC.c menggunakan perintah
gcc EXEC.c -o EXEC
Contoh:
// Program execDemo.c pada
// bahasa C
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
// Null mematikan array dari
// karakter pointer.
char *args[]={"./EXEC",NULL};
execv(args[0],args);
// Semua statement akan
// diabaikan setelah fungsi
// execvp() dipanggil, dan
// proses (execDemo.c) akan
// digantikan oleh proses
// (EXEC.c).
printf("Ending-----");
return 0;
}
Selanjutnya ciptakan file executable dari execDemo.c menggunakan perintah:
gcc execDemo.c -o execDemo
Setelah file executable execDemo.c dijalankan menggunakan perintah ./excDemo, maka nilai output-nya adalah:
Program EXEC.c yang dipanggil oleh execv()
tiga, execlp dan execl: dua fungsi tersebut digunakan untuk tujuan yang sama, tetapi sintak dari keduanya sedikit berbeda seperti diperlihatkan sebagai berikut:
Sintak:
- int execlp(const char *file, const char *arg,.../* (char *) NULL */);
- int execl(const char *path, const char *arg,.../* (char *) NULL */);
file: nama file berasosiasi dengan file yang akan dieksekusi.
const char *arg dan ellipses: mendeskripsikan sebuah daftar dari satu atau lebih pointer ke null-terminated string yang merepresentasikan daftar argumen yang tersedia untuk mengeksekusi program.
Program bahasa C yang sama yang telah diperlihatkan sebelumnya juga akan dieksekusi dengan fungsi execlp() atau execl() dan akan mengampilkan tugas yang sama, yaitu mengganti proses saat ini dengan proses yang baru.
empat, execvpe dan execle: dua fungsi ini juga memiliki tujuan yang sama tetapi sintak dari keduanya sedikit berbeda dari semua anggota exec family sebelumnya. Sintak dari kedua fungsi tersebut diperlihatkan sebagai berikut:
Sintak: int execvpe(const char *file, char *const argv[],char *const envp[]);
Sintak:
- int execle(const char *path, const char *arg, .../*, (char *) NULL,
- char * const envp[] */);
Sintak tersebut memperlihatkan satu perbedaan argumen dari semua anggota exex.
char * const envp[]: memungkinkan untuk melakukan pemanggilan secara khusus dari lingkungan pengembangan program melalui argumen envp.
envp: Argumen ini adalah array dari pointer ke null-terminated string dan akan dihentikan oleh pointer null. Fungsi lainnya mengambil lingkungan untuk gambar proses baru dari variabel ekternal dalam proses pemanggilan.
Exec Family dalam Bahasa C: Pemahaman Mendalam tentang Fungsi dan Peranannya
Dalam pengembangan perangkat lunak berbasis sistem operasi, fungsi eksekusi program sering kali menjadi hal yang sangat penting. Bahasa pemrograman C, sebagai salah satu bahasa yang terkenal kuat dan efisien, menyediakan sejumlah fungsi yang memungkinkan interaksi langsung dengan sistem operasi, salah satunya adalah Exec Family. Fungsi-fungsi dalam keluarga exec (Exec Family) adalah serangkaian fungsi yang disediakan oleh pustaka standar C dan digunakan untuk menjalankan program baru dari program yang sedang berjalan. Pemahaman terhadap keluarga fungsi exec sangat krusial bagi pengembang perangkat lunak, terutama yang bekerja dalam lingkungan sistem operasi berbasis UNIX, untuk menciptakan aplikasi yang kompleks dan memiliki kontrol penuh terhadap eksekusi program.
Konsep Dasar Exec Family
Keluarga fungsi exec pada dasarnya memiliki satu tujuan utama: mengganti proses yang sedang berjalan dengan proses baru. Fungsi-fungsi dalam keluarga ini memungkinkan eksekusi sebuah program baru, yang akan menggantikan proses saat ini secara langsung. Fungsi-fungsi exec mengubah aliran program sehingga program yang baru dijalankan menggantikan program yang ada, tanpa kembali ke proses asli yang memanggil fungsi exec. Jika sebuah fungsi exec berhasil dipanggil, kontrol tidak akan pernah kembali ke instruksi selanjutnya di dalam program awal; proses yang lama telah digantikan sepenuhnya oleh proses baru.
Fungsi exec tidak membuat proses baru, melainkan menggantikan proses yang ada dengan kode dan konteks program baru. Dalam sistem operasi berbasis UNIX, proses yang memanggil exec sebenarnya menyerahkan kontrol ke sistem operasi untuk menjalankan program lain yang ditentukan, sambil mewarisi identitas prosesnya. Jadi, dalam konteks pengembangan, exec adalah alat yang memungkinkan pengembang menjalankan program eksternal dari dalam program C dengan lancar, tanpa perlu membuat atau mengelola proses tambahan.
Anggota dari Exec Family
Keluarga exec terdiri dari beberapa fungsi utama yang memiliki karakteristik serupa namun berbeda dalam parameter yang digunakan. Setiap fungsi dalam keluarga exec ini memiliki peran khusus, tetapi tujuannya tetap sama: menggantikan proses yang berjalan dengan program baru.
- execl: Fungsi `execl` digunakan untuk menjalankan program baru dengan cara yang sederhana. Pada fungsi ini, argumen yang disediakan adalah nama file yang akan dieksekusi, diikuti oleh argumen-argumen lain yang diberikan satu per satu sebagai parameter tambahan. Parameter-parameter ini akan diteruskan sebagai argumen ke program yang baru, sehingga program tersebut dapat dijalankan dengan konfigurasi tertentu sesuai kebutuhan.
- execv: Fungsi `execv` memiliki karakteristik yang serupa dengan `execl`, namun berbeda dalam penyampaian argumen. Dalam `execv`, argumen disampaikan dalam bentuk array, bukan satu per satu. Array tersebut berisi daftar argumen yang akan diteruskan ke program baru. Pendekatan ini sering kali lebih fleksibel dan memungkinkan pengelolaan argumen dalam jumlah besar atau yang dinamis, yang sangat berguna ketika argumen berasal dari input eksternal.
- execle: Variasi `execle` mirip dengan `execl`, tetapi memungkinkan penerusan variabel lingkungan (environment variables) ke program yang akan dijalankan. Variabel lingkungan ini biasanya disimpan dalam array terakhir sebagai argumen. Penggunaan `execle` cocok ketika program baru membutuhkan konfigurasi khusus melalui variabel lingkungan, tanpa mempengaruhi lingkungan dari proses pemanggil.
- execve: Fungsi `execve` adalah yang paling fleksibel dan umum digunakan dalam keluarga exec karena menerima parameter dalam bentuk array untuk argumen dan variabel lingkungan sekaligus. Pengembang dapat mengontrol penuh proses dan konteks eksekusi program dengan `execve`. Karena fleksibilitasnya ini, `execve` adalah satu-satunya fungsi exec yang disebut sebagai fungsi sistem dalam sebagian besar implementasi UNIX.
- execlp dan execvp: Kedua fungsi ini serupa dengan `execl` dan `execv`, namun perbedaannya adalah dalam penentuan path program. Pada `execlp` dan `execvp`, nama program dicari di sepanjang path lingkungan, memungkinkan pemanggilan program tanpa menentukan jalur absolutnya. Hal ini sangat berguna untuk menjalankan program umum yang terdapat di lokasi standar pada sistem operasi, seperti shell atau program utilitas lainnya.
Cara Kerja dan Fungsi Utama Exec Family
Fungsi-fungsi dalam keluarga exec bekerja dengan cara melakukan panggilan sistem (system call) ke sistem operasi untuk mengganti proses yang ada dengan program baru. Ketika sebuah fungsi exec dipanggil, kernel sistem operasi akan mengisi ulang memori proses yang ada dengan kode dan data dari program yang baru. Program baru ini pun akan mulai berjalan dari awal, menggantikan proses yang lama tanpa kembali lagi ke program yang asli. Hal ini membuat exec sangat efisien dalam konteks sumber daya, karena tidak membuat proses tambahan atau menciptakan beban memori tambahan. Namun, ini juga berarti bahwa begitu fungsi exec dipanggil, program asli tidak lagi berjalan, dan semua instruksi yang dituliskan setelah pemanggilan exec tidak akan pernah dieksekusi.
Fungsi Exec dalam Pembuatan Fork dan Eksekusi Bersamaan
Dalam konteks sistem UNIX, fungsi exec sering digunakan bersama dengan fungsi `fork`. Fungsi `fork` menciptakan proses baru, yang sering disebut sebagai "anak proses", yang merupakan salinan dari proses "induk". Setelah melakukan fork, proses anak dapat menjalankan fungsi exec untuk menggantikan dirinya sendiri dengan program yang baru, sedangkan proses induk tetap menjalankan instruksi aslinya. Kombinasi antara fork dan exec sangat penting dalam menciptakan aplikasi yang kompleks, seperti shell atau server, di mana seringkali diperlukan eksekusi program eksternal di bawah kendali proses utama.
Proses forking dan exec memberikan kemampuan kepada program untuk melakukan multitasking dan membagi tugas ke berbagai proses. Dalam sistem operasi modern, kemampuan ini sangat penting untuk efisiensi dan responsivitas program. Ketika suatu proses induk membutuhkan suatu fungsi atau layanan tambahan, seperti menjalankan utilitas atau perintah tertentu, proses induk dapat memanggil fork untuk membuat proses anak yang independen, dan kemudian menjalankan fungsi exec pada proses anak untuk menjalankan program baru tersebut. Dengan cara ini, sistem dapat menangani banyak tugas secara bersamaan tanpa mengorbankan kinerja atau efisiensi sumber daya.
Kelebihan Penggunaan Exec Family dalam Pengembangan Sistem
Penggunaan fungsi exec dalam pengembangan perangkat lunak berbasis sistem operasi membawa banyak kelebihan. Fungsi exec memungkinkan pengembang untuk menjalankan program tambahan dengan cepat dan efisien tanpa menciptakan overhead yang tidak diperlukan. Dalam lingkungan yang menuntut efisiensi tinggi seperti sistem embedded atau aplikasi real-time, kemampuan untuk menggantikan proses secara langsung dengan program baru adalah keuntungan yang besar.
Fungsi exec juga memungkinkan untuk menjalankan aplikasi dari berbagai konfigurasi, karena pengembang dapat mengontrol argumen dan variabel lingkungan yang digunakan dalam program baru. Hal ini memungkinkan fleksibilitas yang tinggi, terutama ketika program yang dijalankan membutuhkan konfigurasi khusus atau ketika variabel lingkungan digunakan untuk menentukan perilaku program.
Dalam konteks keamanan, fungsi exec juga memainkan peran penting, karena proses baru yang dijalankan dapat dikelola secara terpisah dari proses induknya. Sistem operasi dapat memberikan hak istimewa khusus kepada proses baru ini atau membatasi aksesnya tergantung pada konfigurasi, yang membantu mengurangi risiko keamanan dan memastikan bahwa program yang berjalan tidak memiliki akses yang tidak diinginkan terhadap sistem atau data sensitif.
Kekurangan dan Keterbatasan Fungsi Exec
Meskipun fungsi exec sangat bermanfaat, ada beberapa kekurangan yang perlu dipertimbangkan. Karena proses lama digantikan sepenuhnya oleh proses baru, semua data atau status dari proses lama hilang kecuali disimpan secara eksplisit. Hal ini dapat menyebabkan kehilangan informasi, terutama jika fungsi exec dipanggil tanpa mempertimbangkan efek samping dari penghentian proses yang lama.
Keterbatasan lainnya adalah kurangnya fleksibilitas dalam pengendalian alur program setelah fungsi exec dipanggil. Karena eksekusi tidak pernah kembali ke proses awal, proses baru sepenuhnya mengendalikan aliran, sehingga programmer harus berhati-hati dalam mengatur kapan dan bagaimana menggunakan fungsi exec. Keterbatasan ini membuat fungsi exec tidak selalu cocok untuk semua kasus, terutama jika program membutuhkan kontrol atau interaksi dua arah antara proses induk dan program yang dipanggil.
Kesimpulan
Exec Family dalam bahasa C adalah kumpulan fungsi yang sangat berguna untuk menggantikan proses yang sedang berjalan dengan program baru. Dengan menyediakan cara yang efisien untuk menjalankan program lain dari dalam program C, fungsi-fungsi ini memainkan peran kunci dalam pengembangan perangkat lunak yang bekerja erat dengan sistem operasi. Dalam lingkungan UNIX, exec sering digunakan bersama dengan fork untuk menciptakan aplikasi yang kompleks dan efisien.
Pemahaman mendalam tentang cara kerja dan perbedaan antara setiap anggota keluarga exec sangat penting bagi pengembang yang ingin memanfaatkan kekuatan dari fungsi-fungsi ini. Dengan menggunakan exec secara efektif, program dapat dibuat lebih efisien, fleksibel, dan terstruktur, memungkinkan pengembang untuk menciptakan aplikasi yang optimal di lingkungan yang menuntut kinerja tinggi.
Artikel ini didedikasikan kepada: Mohamad Abdurahman Karamullah, Monia, Muhammad Mualip Al Muhajirin, Novia Ratih Handadari, dan Ratih Ismawati.
terima kasih infonya,,
BalasHapusApa perbedaan antara fork() dan exe()?
BalasHapusfork() mengembalikan PID dari child proses.
HapusPerbedaan utama antara fork() dan exe() adalah bahwa fork memulai proses baru yang merupakan salinan dari proses utama. Sedangkan exec() menggantikan image proses saai dengan proses yang baru, dimana proses parent dan child akan dijalankan secara bersamaan.
Apa yang dimaksud dengan exex pada UNIX?
BalasHapusPerintah exec pada Linux digunakan untuk menjalankan perintah dari bash itu sendiri. Dimana perintah ini tidak memuat proses baru, melainkan hanya mengganti bash dengan perintah lain yang akan dijalankan. Jika perintah exec perhasil dieksekusi, maka perintah tersebut tidak akan kembali ke proses pemanggilan.
HapusApa kegunaan dari perintah exec ketika dipanggil?
BalasHapusPemanggilan sitem exec digunakan untuk menjalankan file yang berada dalam proses aktif. Ketika perintah exec dipanggil, file yang dapat dieksekusi sebelumnya diganti dengan file baru dijalankan. Lebih tepatnya, dapat dikatakan bahwa pemanggilan sistem exec akan menggantikan file atau program lama dari proses dengan file atau program baru yang telah disiapkan.
Hapus