GNU/Linux >> Belajar Linux >  >> Linux

Howto:Pemrograman C dengan Direktori di Linux

Ketika dikatakan bahwa di Linux semuanya adalah file, maka itu benar adanya. Sebagian besar operasi yang dapat kita lakukan pada file dapat dilakukan pada entitas lain seperti socket, pipe, direktori, dll.

Ada situasi tertentu di mana utilitas perangkat lunak mungkin harus berjalan melintasi direktori di sistem Linux untuk menemukan atau mencocokkan sesuatu. Ini adalah kasus penggunaan di mana programmer utilitas itu harus berurusan dengan pemrograman direktori. Jadi, dalam artikel ini kita akan membahas dasar-dasar pemrograman direktori berikut dengan sebuah contoh.

  1.  Membuat direktori.
  2.  Membaca direktori.
  3.  Menghapus direktori.
  4.  Menutup direktori.
  5.  Mendapatkan direktori kerja saat ini.

Kita akan melihat fungsi-fungsi yang digunakan untuk setiap langkah di atas dan akhirnya kita akan melihat contoh yang akan merangkum semua operasi direktori.

1. Membuat Direktori

Sistem Linux menyediakan panggilan sistem berikut untuk membuat direktori :

#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);

Argumen 'pathname' digunakan untuk nama direktori.

Dari halaman manual :

Mode argumen menentukan izin untuk digunakan. Ini dimodifikasi oleh umask proses dengan cara biasa:izin dari direktori yang dibuat adalah (mode &~umask &0777). Bit mode lain dari direktori yang dibuat bergantung pada sistem operasi. Untuk Linux, lihat di bawah.

Direktori yang baru dibuat akan dimiliki oleh ID pengguna efektif dari proses tersebut. Jika direktori yang berisi file memiliki set bit set-group-ID, atau jika sistem file di-mount dengan semantik grup BSD (mount -o bsdgroups atau, secara sinonim mount -o grpid), direktori baru akan mewarisi kepemilikan grup dari induknya; jika tidak maka akan dimiliki oleh ID grup yang efektif dari proses tersebut. Jika direktori induk memiliki bit set-group-ID, maka direktori yang baru dibuat juga demikian.

2. Membaca Direktori

Sebuah keluarga fungsi digunakan untuk membaca isi direktori.

1. Pertama, aliran direktori perlu dibuka. Ini dilakukan dengan panggilan sistem berikut :

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);

Dari halaman manual :

Fungsi opendir() membuka aliran direktori yang sesuai dengan nama direktori, dan mengembalikan pointer ke aliran direktori. Aliran diposisikan pada entri pertama dalam direktori.

2. Selanjutnya, untuk membaca entri dalam direktori, aliran terbuka di atas digunakan oleh panggilan sistem berikut:

#include
struct dirent *readdir(DIR *dirp);

Dari halaman manual :

Fungsi readdir() mengembalikan pointer ke struktur dirent yang mewakili entri direktori berikutnya dalam aliran direktori yang ditunjuk oleh dirp. Ini mengembalikan NULL saat mencapai akhir aliran direktori atau jika terjadi kesalahan.

Di Linux, struktur dirent didefinisikan sebagai berikut:

struct dirent
{
    ino_t          d_ino;       /* inode number */
    off_t          d_off;       /* offset to the next dirent */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported
                                   by all file system types */
    char           d_name[256]; /* filename */
};

3. Menghapus Direktori

Sistem Linux menyediakan panggilan sistem berikut untuk menghapus direktori :

#include <unistd.h>
int rmdir(const char *pathname);

Dari halaman manual :

rmdir() menghapus direktori yang diwakili oleh 'pathname' jika kosong. JIKA direktori tidak kosong maka fungsi ini tidak akan berhasil.

4. Menutup direktori

Sistem Linux menyediakan panggilan sistem berikut untuk menutup direktori :

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);

Dari halaman manual :

Fungsi closedir() menutup aliran direktori yang terkait dengan dirp. Panggilan yang berhasil ke closedir() juga menutup deskriptor file dasar yang terkait dengan dirp. Dirp deskriptor aliran direktori tidak tersedia setelah panggilan ini.

5. Mendapatkan Direktori Kerja Saat Ini

Sistem Linux menyediakan panggilan sistem berikut untuk mendapatkan CWD :

#include <unistd.h>
char *getcwd(char *buf, size_t size);

Dari halaman manual :

Fungsi getcwd() menyalin nama path absolut dari direktori kerja saat ini ke array yang ditunjuk oleh buf, yang berukuran panjang. Fungsi ini mengembalikan string diakhiri-nol yang berisi nama path absolut yang merupakan direktori kerja saat ini dari proses panggilan. Nama jalur dikembalikan sebagai hasil fungsi dan melalui argumen buf, jika ada. Jika panjang nama path absolut dari direktori kerja saat ini, termasuk penghentian byte null, melebihi ukuran byte, NULL dikembalikan, dan errno disetel ke ERANGE; aplikasi harus memeriksa kesalahan ini, dan mengalokasikan buffer yang lebih besar jika perlu.

6. Contoh

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    if(2 != argc)
    {
        printf("\n Please pass in the directory name \n");
        return 1;
    }

    DIR *dp = NULL;
    struct dirent *dptr = NULL;
    // Buffer for storing the directory path
    char buff[128];
    memset(buff,0,sizeof(buff));

    //copy the path set by the user
    strcpy(buff,argv[1]);

    // Open the directory stream
    if(NULL == (dp = opendir(argv[1])) )
    {
        printf("\n Cannot open Input directory [%s]\n",argv[1]);
        exit(1);
    }
    else
    {
        // Check if user supplied '/' at the end of directory name.
        // Based on it create a buffer containing path to new directory name 'newDir'
        if(buff[strlen(buff)-1]=='/')
        {
            strncpy(buff+strlen(buff),"newDir/",7);
        }
        else
        {
            strncpy(buff+strlen(buff),"/newDir/",8);
        }

        printf("\n Creating a new directory [%s]\n",buff);
        // create a new directory
        mkdir(buff,S_IRWXU|S_IRWXG|S_IRWXO);
        printf("\n The contents of directory [%s] are as follows \n",argv[1]);
        // Read the directory contents
        while(NULL != (dptr = readdir(dp)) )
        {
            printf(" [%s] ",dptr->d_name);
        }
        // Close the directory stream
        closedir(dp);
        // Remove the new directory created by us
        rmdir(buff);
        printf("\n");
    }

    return 0;
}

Contoh di atas seharusnya sudah cukup jelas.

Output dari contoh di atas adalah :

# ./direntry /home/himanshu/practice/linux

 Creating a new directory [/home/himanshu/practice/linux/newDir/]

 The contents of directory [/home/himanshu/practice/linux] are as follows
 [redhat]  [newDir]  [linuxKernel]  [..]  [ubuntu]  [.]

Linux
  1. Pantau sistem Linux Anda di terminal Anda dengan procps-ng

  2. Memahami panggilan sistem di Linux dengan strace

  3. Menjadwalkan tugas sistem dengan Cron di Linux

  1. Tingkatkan kinerja sistem Linux dengan noatime

  2. Cara Mengganti Nama Direktori di Linux

  3. Jumlah maksimum file/direktori di Linux?

  1. Perintah Shutdown Linux (dengan Contoh)

  2. Membuat, Menghapus, dan Mengelola Direktori di Linux

  3. Howto:Pemrograman C dengan File Sementara di Linux