
Itu dup2()fungsi sistem digunakan untuk membuat copyan dari deskriptor file yang ada. Di Linux, ada 3 deskriptor file standar. Mereka:
stdin : Ini adalah deskriptor file input standar. Ini digunakan untuk mengambil input dari terminal secara default.scanf(),getc() dll fungsi menggunakan stdindeskriptor file untuk mengambil input user. Itustdin deskriptor file juga diwakili oleh nomor 0.
stdout : Ini adalah deskriptor file keluaran standar. Ini digunakan untuk mencetak sesuatu ke konsol/terminal secara default. Yang banyak digunakanprintf() fungsi menggunakan stdoutuntuk mencetak output yang Anda inginkan ke konsol/terminal. Itustdout deskriptor file juga diwakili oleh nomor 1.
stderr : Ini adalah deskriptor file error standar. Itu melakukan hal yang sama sepertistdoutdeskriptor file. Itustderrdeskriptor file digunakan untuk mencetak pesan error pada konsol/terminal. Satu-satunya perbedaan adalah jika Anda menggunakanstderr deskriptor file untuk mencetak pesan error, dan stdoutdeskriptor file untuk mencetak output normal, kemudian Anda dapat memisahkannya nanti. Misalnya, Anda dapat mengarahkan pesan error ke file dan output normal ke konsol atau file lain. Itustderr deskriptor file juga diwakili oleh nomor 2.
Selain 3 deskriptor file ini, Anda dapat membuat deskriptor file tambahan di C. Untuk membuat deskriptor file baru, Anda dapat menggunakan open() fungsi dalam C. open() fungsi membuka file baru, membuat deskriptor file untuk file itu dan melampirkan nomor selain 0,1,2 ke deskriptor file.
Setelah Anda membuka file menggunakan open() fungsi, Anda dapat menggunakan read() dan write() berfungsi untuk membaca dan menulis ke deskriptor file yang baru dibuat.
Sekarang, bayangkan situasi di mana Anda ingin membaca dari file tertentu menggunakan scanf() atau getc() fungsi dan tulis ke file lain menggunakan printf()fungsi. Ini bukan perilaku default dariscanf(),getc() dan printf()fungsi seperti yang saya jelaskan sebelumnya. Secara default,scanf() dan getc() fungsi menggunakan stdin dan printf() menggunakan stdoutdan tidak ada cara untuk memberitahu fungsi-fungsi ini untuk menggunakan deskriptor file lain. Jadi, untuk mengubah perilaku default ini, Anda harus menggantistdin dan stdoutdeskriptor file dengan deskriptor file yang Anda inginkan. Inilah yangdup2()fungsi sistem tidak. Itudup2() fungsi menyalin deskriptor file ke deskriptor file lain.
dup2() Sintaks dan Nilai Pengembalian:
Sintaks dari dup2() fungsinya adalah:
int dup2(int old_file_descriptor, int new_file_descriptor);
dup2() fungsi menyalinold_file_descriptor ke dalam new_file_descriptor. jikanew_file_descriptor sudah ada, maka secara otomatis ditutup dan kemudian old_file_descriptor dicopy ke sana.
Pada kesuksesan, dup2()fungsi mengembalikan deskriptor file baru. Jika terjadi error,dup2() kembali -1.
Itu dup2() fungsi didefinisikan dalam file header unistd.h.
Anda harus menyertakan header unistd.h di file sumber C Anda untuk menggunakan dup2() fungsi sebagai berikut:
#include <unistd.h>
Untuk informasi lebih lanjut, periksa halaman manual dari dup2() dengan perintah berikut:
$ man dup2
Contoh 1:
Buat file sumber C baru 01_dup2.c dan ketik baris kode berikut di file.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(void) {
int number1, number2, sum;
int input_fds = open("./input.txt", O_RDONLY);
if(dup2(input_fds, STDIN_FILENO) < 0) {
printf("Unable to duplicate file descriptor.");
exit(EXIT_FAILURE);
}
scanf("%d %d", &number1, &number2);
sum = number1 + number2;
printf("%d + %d = %dn", number1, number2, sum);
return EXIT_SUCCESS;
}
Sekarang, buat file baru input.txt di direktori yang sama dan ketik baris berikut di dalamnya.
15 41
Tujuan utama dari program ini adalah untuk membaca 2 bilangan bulat dari input.txt file menggunakan scanf() fungsi, tambahkan dan cetak jumlahnya.
Pertama, saya menyertakan file header yang diperlukan dengan baris kode berikut.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
Dalam main() fungsi, saya mendefinisikan variabel yang diperlukan.
int number1, number2, sum;
Kemudian, saya membuka file input.txt dalam cara hanya baca (O_RDONLY) menggunakan open() berfungsi dan menyimpan deskriptor file dalam variabel input_fds.
int input_ fds = open("./input.txt", O_RDONLY);
Setelah saya memiliki deskriptor file dari input.txt file, saya menyalin deskriptor file ke deskriptor file input standar STDIN_FILENO (0) menggunakan dup2()fungsi. Deskriptor file dariinput.txt sekarang default stdin deskriptor file.
dup2(input_fds, STDIN_FILENO)
Saya juga bisa menulis dup2()fungsi sebagai berikut. Hasilnya akan sama.STDIN_FILENO memegang nilai 0, yang merupakan nilai dari stdin deskriptor file.
dup2(input_fds, 0)
Saya juga memeriksa dup2()error dengan baris berikut. Jika terjadi error, program diatur untuk mencetak pesan error dan keluar.
if(dup2(input_fds, STDIN_FILENO) < 0) {
printf("Unable to duplicate file descriptor.");
exit(EXIT_FAILURE);
}
Lalu, saya menggunakan scanf() untuk memindai 2 angka dari input.txt mengajukan.
scanf("%d %d", &number1, &number2);
Kemudian, saya menambahkan angka dan mencetak jumlahnya di konsol/terminal, default stdout.
sum = number1 + number2;
printf("%d + %d = %dn", number1, number2, sum);
Seperti yang Anda lihat, saya mendapatkan hasil yang diharapkan setelah saya menjalankan program.
Contoh 2:
Buat file sumber C baru 02_dup2.c dan ketik baris kode berikut di file.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void) {
int number1, number2, sum;
int input_fds = open("./input.txt", O_RDONLY);
int output_fds = open("./output.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2(input_fds, STDIN_FILENO);
dup2(output_fds, STDOUT_FILENO);
scanf("%d %d", &number1, &number2);
sum = number1 + number2;
printf("%d + %d = %dn", number1, number2, sum);
return EXIT_SUCCESS;
}
Sekarang, buat file baru input.txt di direktori yang sama dan ketik baris berikut di dalamnya.
15 41
Dalam program ini, saya melakukan hal yang sama seperti di Example 1. Satu-satunya perbedaan adalah saya membuat file baruoutput.txt dan menggunakan deskriptor file output.txt sebagai default stdout deskriptor file menggunakan dup2()fungsi. Sekarang, semua output dariprintf() fungsi akan ditulis ke output.txt mengajukan.
Saya membuat file baru dan menyimpan deskriptor file di output_fds variabel.
int output_fds = open("./output.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
Saya juga menyalin deskriptor file output_fds ke deskriptor file stdout. Saya menggunakan konstanta yang telah ditentukanSTDOUT_FILENO.
dup2(output_fds, STDOUT_FILENO);
STDOUT_FILENO berisi nilai1 (nilai deskriptor file default dari stdout). Jadi, saya bisa menulis ulang panggilan fungsi dup2() sebagai berikut. Itu akan memberikan hasil yang sama.
dup2(output_fds, 1);
Sisa programnya sama. Seperti yang Anda lihat, setelah saya menjalankan program, program tidak mencetak apa pun di konsol/terminal.
Tapi, program membuat file baru output.txt mengajukan.
Seperti yang Anda lihat, output ditulis ke file output.txt.
Jika Anda ingin menulis semua error (stderr) ke file lain, lalu Anda juga dapat menyalin deskriptor file ke stderr deskriptor file sebagai berikut.
dup2(error_fds, STDERR_FILENO);
Jadi, begitulah cara Anda menggunakan dup2() panggilan sistem di C. Terima kasih telah membaca artikel ini.