GNU/Linux >> Belajar Linux >  >> Linux

Praktik Pengkodean Terbaik untuk Pemrograman Sistem Linux dalam Bahasa C – Bagian 1

Saat mengembangkan program, programmer harus mengingat beberapa hal seperti kode tidak boleh rumit yaitu harus dapat dipelihara, portabilitas adalah area lain yang harus diingat. Jadi kita melihat bahwa ada beberapa praktik baik yang harus diikuti oleh programmer untuk menghasilkan kode yang baik. Di sini, di artikel ini, kita akan fokus pada beberapa praktik baik yang harus diikuti oleh programmer saat bekerja dengan panggilan sistem di Linux.

Apa itu panggilan sistem?

Panggilan sistem adalah panggilan fungsi khusus yang dibuat untuk meminta beberapa layanan dari Kernel. Layanan yang diminta dapat berupa membuat proses baru, mengakses perangkat keras seperti hard disk, dll. Ketika panggilan sistem dilakukan, eksekusi beralih dari mode pengguna ke mode kernel dan ketika layanan yang diperlukan disediakan oleh kernel maka eksekusi beralih kembali ke mode pengguna. Contoh panggilan sistem dapat berupa fork(), read(), write() dll.

Menangani panggilan sistem

Poin-poin berikut harus diingat saat menangani panggilan sistem:

  • Pemrogram harus memiliki pengetahuan tentang panggilan sistem. Seperti, apa sebenarnya yang dilakukannya, sumber daya sistem yang digunakannya, jenis argumen apa yang diharapkannya, dan khususnya dalam kasus apa ia gagal.
  • Sebagian besar panggilan sistem linux mengembalikan kode kesalahan jika gagal. Kode kesalahan ini dapat bervariasi berdasarkan jenis kesalahan yang menyebabkan kegagalan. Jadi, penanganan kesalahan yang tepat harus dilakukan sehingga setiap jenis kesalahan harus ditangani dengan benar dan dieskalasi dengan jelas (baik ke pengguna atau modul induk).
  • Untuk pengetahuan menyeluruh tentang panggilan sistem dan kode kesalahan yang dikembalikan, saya sangat menyarankan untuk membaca halaman manual dari panggilan sistem tertentu. Halaman manual adalah referensi terbaik untuk memulai dan mengembangkan pemahaman dasar yang baik tentang panggilan sistem apa pun di Linux.

Kegagalan panggilan sistem umum

Meskipun kegagalan panggilan sistem mungkin bergantung pada jenis kesalahan yang ditemui saat menjalankan panggilan sistem, berikut adalah daftar alasan yang sebagian besar berkontribusi pada kegagalan panggilan sistem:

  •  Jika panggilan sistem mencoba mengakses perangkat keras sistem dan karena alasan apa pun perangkat keras tidak tersedia atau menganggap perangkat keras rusak, maka panggilan sistem akan gagal.
  • Saat menjalankan panggilan sistem, jika sinyal prioritas tinggi terjadi, hal itu juga dapat menyebabkan kegagalan eksekusi panggilan sistem.
  • Ada situasi ketika melalui panggilan sistem, sebuah program mencoba melakukan tugas tertentu yang memerlukan hak istimewa atau root. Jika program tidak memiliki hak istimewa seperti itu, maka panggilan sistem juga akan gagal.
  • Meneruskan argumen yang tidak valid adalah alasan lain yang sangat umum untuk kegagalan panggilan sistem.
  • Misalkan panggilan sistem dibuat untuk meminta beberapa memori dari heap dan karena beberapa alasan sistem tidak dapat mengalokasikan memori ke proses permintaan yang membuat panggilan sistem, dalam hal ini juga panggilan sistem akan gagal.

Daftar di atas tidak lengkap karena mungkin ada banyak alasan lain yang menyebabkan kegagalan panggilan sistem.

Bekerja dengan kode kesalahan

Seperti yang telah dibahas, setiap panggilan sistem mengembalikan kode kesalahan tertentu untuk setiap jenis kesalahan yang ditemuinya (yang menyebabkan kegagalan panggilan sistem). Jadi, mengidentifikasi dan mengkomunikasikan informasi kesalahan adalah tugas pemrograman yang sangat vital. Secara umum sebagian besar panggilan sistem mengembalikan '0' pada keberhasilan dan bukan nol pada kegagalan tetapi panggilan sistem yang mengembalikan pointer ke memori (seperti malloc() ) mengembalikan '0' atau NULL pada kegagalan dan nilai penunjuk bukan nol pada keberhasilan .

CATATAN:Pengamatan di atas mungkin tidak benar untuk semua panggilan sistem. Mungkin ada beberapa pengecualian.

Jadi, kembali ke kode kesalahan, seperti yang dibahas, mereka dapat memberikan informasi penting tentang penyebab kegagalan panggilan sistem. Sekarang, karena setiap kode kesalahan dikaitkan dengan alasan tertentu, maka program dapat memiliki peta kode kesalahan dan teks yang menjelaskan penyebab kesalahan. Tapi, ini sangat tidak efisien dan tidak praktis karena ini akan menghasilkan banyak pemetaan untuk setiap panggilan sistem yang digunakan dalam program. Jadi, sekarang pertanyaannya adalah apa cara yang lebih efisien untuk mencapai ini?

Variabel 'errno'

Dari halaman manual variabel ini :

File header  mendefinisikan variabel integer errno, yang disetel oleh panggilan sistem dan beberapa fungsi library jika terjadi kesalahan untuk menunjukkan apa yang salah. Nilainya signifikan hanya ketika nilai kembalian panggilan menunjukkan kesalahan (yaitu, -1 dari sebagian besar panggilan sistem; -1 atau NULL dari sebagian besar fungsi perpustakaan); fungsi yang berhasil diizinkan untuk mengubah errno.
Nomor kesalahan yang valid semuanya bukan nol; errno tidak pernah disetel ke nol oleh panggilan sistem atau fungsi perpustakaan apa pun. Untuk beberapa panggilan sistem dan fungsi library (misalnya, getpriority), -1 adalah pengembalian atas keberhasilan yang valid. Dalam kasus seperti itu, pengembalian yang berhasil dapat dibedakan dari pengembalian kesalahan dengan menyetel errno ke nol sebelum panggilan, dan kemudian, jika panggilan mengembalikan status yang menunjukkan bahwa kesalahan mungkin telah terjadi, memeriksa untuk melihat apakah errno memiliki non- nilai nol. errno didefinisikan oleh standar ISO C sebagai nilai yang dapat dimodifikasi dari tipe int, dan tidak boleh dideklarasikan secara eksplisit; errno mungkin makro. errno adalah thread-lokal; menyetelnya di satu utas tidak memengaruhi nilainya di utas lainnya.

Jadi. dari uraian di atas, cukup jelas bahwa ini adalah alat yang sangat berguna dalam hal penanganan kesalahan panggilan sistem di Linux dan dapat menghemat banyak kerja keras. Namun, berhati-hatilah dalam menggunakan variabel ini dalam program multi-utas karena variabel ini bersifat lokal untuk suatu utas sehingga setiap perubahan nilai errno dalam satu utas tidak dapat diakses di utas lainnya.

API strerror()

Nah, satu masalah dengan hanya menggunakan errno adalah masih hanya nilai integer. Deskripsi selalu lebih membantu saat masuk atau saat meneruskan penyebab kesalahan kepada pengguna. Jadi harus ada peta kode kesalahan dan penyebabnya. Inilah API 'strerror()'. Fungsi ini mengambil variabel errno sebagai argumen dan mengembalikan pointer ke string yang berisi deskripsi penyebab yang dipetakan oleh kode kesalahan.

#include <string.h>
char *strerror(int errnum);

Varian lain dari fungsi ini juga tersedia. Untuk informasi lebih lanjut, silakan kunjungi halaman manual untuk API ini.

CATATAN:Pembaca yang tertarik juga dapat melalui perror() API. Ini digunakan untuk mencetak pesan kesalahan untuk kegagalan panggilan sistem pada kesalahan standar.

Contoh

Mari kita ambil contoh untuk mendemonstrasikan penggunaan errno dan strerror()

#include<stdio.h>
#include<errno.h>
#include<string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd = -1;

    // Always Reset errno before use.
    errno = 0;

    // Make sure you are opening a file that does not exist
    fd = open("abcd",O_RDONLY);
    if(fd == -1)
    {
        // Seems like some error occured. Use strerror to print it
        printf("\nStrerror() says -> [%s]\n",(char*)strerror(errno));
        return 1;
    }
    return 0;
}

Pada kode di atas :

  • errno diinisialisasi ke '0' karena awalnya tidak dijamin nol.
  • Buka file yang tidak ada sehingga panggilan sistem open() gagal.
  • Sekarang, strerror() API digunakan untuk mencetak pesan kesalahan berdasarkan kode errno.

Saat program di atas dijalankan :

$ ./strerror
Strerror() says -> [No such file or directory]

Jadi kita melihat bahwa di output kita bisa melihat pesan kesalahan yang berarti alih-alih kode kesalahan.


Linux
  1. 22 Editor Teks Linux Terbaik untuk Pemrograman &Coding

  2. 10 IPTV Terbaik untuk Sistem Linux/Ubuntu pada tahun 2022

  3. Tabel panggilan sistem Linux atau lembar contekan untuk Majelis

  1. Pengerasan Server Linux – Praktik terbaik

  2. Pilih sistem file terbaik untuk Linux Anda

  3. 6 Distribusi Linux Terbaik Untuk Pemrograman

  1. Distro Linux Terbaik Untuk Gaming (Bagian 2)

  2. Cara Menginstal Alat Bahasa Pemrograman R di Linux Mint 20

  3. 10 Penampil Buku Komik Terbaik untuk Sistem Linux