GNU/Linux >> Belajar Linux >  >> Linux

Howto:Pemrograman C dengan File Sementara di Linux

Terkadang saat merancang perangkat lunak, Anda mungkin memiliki persyaratan untuk menyimpan beberapa data (untuk diproses ulang di tahap selanjutnya) untuk beberapa durasi. Beberapa perangkat lunak melakukannya di dalam memori di mana mereka berjalan sementara yang lain dapat membuat file sementara untuk tujuan ini.

Membuat file sementara untuk menyimpan data adalah praktik yang populer di kalangan pengembang perangkat lunak. Ada beberapa panggilan sistem yang digunakan untuk membuat file sementara. Sekarang orang akan berpikir mengapa kita memerlukan panggilan sistem untuk membuat file sementara. Nah alasan utama di balik ini adalah untuk memiliki nama file sementara yang unik. Misalkan ada program yang membuat file sementara saat berjalan dan misalkan beberapa contoh program yang sama berjalan secara bersamaan. Jika keunikan file-file sementara tidak diingat, maka beberapa contoh program yang sama dapat mencoba membuat file-file sementara dengan nama yang sama yang menyebabkan konflik.

Sekarang orang mungkin berpendapat bahwa keunikan dapat dipertahankan dengan memeriksa apakah file dengan nama yang sama ada atau tidak. Sepakat!!!! Tetapi ini akan menghasilkan kode besar yang ditambahkan ke logika perangkat lunak untuk melakukan operasi ini dengan sukses. Jadi, alangkah baiknya jika sistem menyediakan beberapa panggilan yang dapat melakukan hal ini untuk perangkat lunak Anda.

Ada banyak panggilan sistem yang tersedia untuk memanipulasi file-file sementara :

  •  mkstemp()
  •  tmpfile()
  •  tempnam()
  •  tmpnam()
  •  batalkan tautan()

Sementara fungsi mkstemp, tmpfile, tempnam dan tmpnam digunakan untuk membuat file sementara, fungsi unlink digunakan untuk menghapus file sementara yang dibuat. Di sini, di artikel ini, kita akan fokus pada panggilan sistem mkstemp() dan unlink().

Panggilan sistem mkstemp() dan unlink()

Tanda tangan mkstemp() terlihat seperti :

#include <stdlib.h>
int mkstemp(char *template);

Panggilan sistem ini membuat dan membuka file sementara dan mengembalikan deskriptor file terbuka untuknya. Argumen 'template' digunakan untuk menghasilkan nama file sementara. Karena 'template' secara harfiah bertindak seperti nama template sehingga enam karakter terakhir dari buffer yang diteruskan sebagai 'template' harus berisi "XXXXXX" karena karakter ini diganti oleh panggilan sistem untuk membuat nama file sementara menjadi unik.

Tanda tangan unlink() terlihat seperti :

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

unlink() menghapus nama dari sistem file. Jika nama itu adalah tautan terakhir ke file dan tidak ada proses yang membuka file, file akan dihapus dan ruang yang digunakannya tersedia untuk digunakan kembali. Jika nama adalah tautan terakhir ke file tetapi proses apa pun masih membuat file terbuka, file akan tetap ada sampai deskriptor file terakhir yang merujuk padanya ditutup. Jika nama mengacu pada tautan simbolik, tautan tersebut akan dihapus. Jika nama merujuk ke soket, fifo, atau perangkat, nama untuk itu dihapus tetapi proses yang membuat objek terbuka dapat terus menggunakannya.

Juga, untuk memahami cara memanipulasi direktori dalam program C, lihat Pemrograman C dengan Direktori.

Contoh

Mari kita lihat contoh di mana kita menggunakan panggilan mkstemp() dan unlink() untuk mendemonstrasikan penggunaannya untuk memanipulasi file sementara.

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>

int main(void)
{
    // buffer to hold the temporary file name
    char nameBuff[32];
    // buffer to hold data to be written/read to/from temporary file
    char buffer[24];
    int filedes = -1,count=0;

    // memset the buffers to 0
    memset(nameBuff,0,sizeof(nameBuff));
    memset(buffer,0,sizeof(buffer));

    // Copy the relevant information in the buffers
    strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",21);
    strncpy(buffer,"Hello World",11);

    errno = 0;
    // Create the temporary file, this function will replace the 'X's
    filedes = mkstemp(nameBuff);

    // Call unlink so that whenever the file is closed or the program exits
    // the temporary file is deleted
    unlink(nameBuff);

    if(filedes<1)
    {
        printf("\n Creation of temp file failed with error [%s]\n",strerror(errno));
        return 1;
    }
    else
    {
        printf("\n Temporary file [%s] created\n", nameBuff);
    }

    errno = 0;
    // Write some data to the temporary file
    if(-1 == write(filedes,buffer,sizeof(buffer)))
    {
        printf("\n write failed with error [%s]\n",strerror(errno));
        return 1;
    }

    printf("\n Data written to temporary file is [%s]\n",buffer);

    // reset the buffer as it will be used in read operation now
    memset(buffer,0,sizeof(buffer));

    errno = 0;
    // rewind the stream pointer to the start of temporary file
    if(-1 == lseek(filedes,0,SEEK_SET))
    {
        printf("\n lseek failed with error [%s]\n",strerror(errno));
        return 1;
    }

    errno=0;
    // read the data from temporary file
    if( (count =read(filedes,buffer,11)) < 11 )
    {
        printf("\n read failed with error [%s]\n",strerror(errno));
        return 1;
    }

    // Show whatever is read
    printf("\n Data read back from temporary file is [%s]\n",buffer);

    return 0;
}

Pada contoh di atas :

  • Membuat dan membuka file sementara menggunakan fungsi mkstemp().
  •  Fungsi ini memperbarui X pada nama yang kita gunakan dengan beberapa karakter yang membuat keseluruhan nama menjadi unik.
  •  Tepat setelah pembuatan, fungsi unlink() dipanggil.
  •  Memanggil unlink() tidak langsung menghapus file, tetapi menunggu file ditutup atau proses keluar.
  •  Melalui fungsi tulis, beberapa data ditulis ke file sementara
  •  Melalui fungsi baca, data dibaca kembali.
  •  Dua operasi di atas menunjukkan bahwa file sementara dapat digunakan seperti file normal lainnya untuk melakukan operasi file.
  •  Begitu prosesnya keluar, file akan dihapus dengan unlink().

Keluaran dari program di atas adalah :

# ./tempfile 

 Temporary file [/tmp/myTmpFile-wH5sLq] created

 Data written to temporary file is [Hello World]

 Data read back from temporary file is [Hello World]

Jadi kita melihat bahwa X yang kita gunakan dalam template nama file sementara sebenarnya digantikan oleh beberapa karakter acak (wH5sLq dalam kasus ini) membuat nama file sementara menjadi unik.


Linux
  1. Salin file di terminal Linux

  2. Pindahkan file di terminal Linux

  3. Cara mengenkripsi file dengan gocryptfs di Linux

  1. Temukan file dan direktori di Linux dengan perintah find

  2. Memindahkan file di Linux tanpa mv

  3. Bagaimana cara mendaftar file dengan path lengkap di Linux?

  1. Izin File di Linux dengan Contoh

  2. Howto:Pemrograman C dengan Direktori di Linux

  3. File zip diperluas dengan garis miring terbalik di Linux, tanpa subdirektori