Pemrograman C

dup2 Panggilan Sistem di C

dup2 Panggilan Sistem di C
Itu duplikat2() fungsi sistem digunakan untuk membuat salinan 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 stdin deskriptor file untuk mengambil input pengguna. Itu stdin 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 digunakan printf() fungsi menggunakan stdout untuk mencetak output yang Anda inginkan ke konsol/terminal. Itu stdout deskriptor file juga diwakili oleh nomor 1.

stderr: Ini adalah deskriptor file kesalahan standar. Itu melakukan hal yang sama seperti stdout deskriptor file. Itu stderr deskriptor file digunakan untuk mencetak pesan kesalahan di konsol/terminal. Satu-satunya perbedaan adalah jika Anda menggunakan stderr deskriptor file untuk mencetak pesan kesalahan, dan stdout deskriptor file untuk mencetak output normal, kemudian Anda dapat memisahkannya nanti. Misalnya, Anda dapat mengarahkan pesan kesalahan ke file dan output normal ke konsol atau file lain. Itu stderr 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 Buka() fungsi dalam C. Itu Buka() 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 Buka() fungsi, Anda dapat menggunakan Baca() dan menulis() 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 dari scanf(), getc() dan printf() fungsi seperti yang saya jelaskan sebelumnya. Secara default, scanf() dan getc() fungsi menggunakan stdin dan printf() menggunakan stdout dan tidak ada cara untuk memberi tahu fungsi-fungsi ini untuk menggunakan deskriptor file lain. Jadi, untuk mengubah perilaku default ini, Anda harus mengganti stdin dan stdout deskriptor file dengan deskriptor file yang Anda inginkan. Inilah yang duplikat2() fungsi sistem tidak. Itu duplikat2() fungsi menyalin deskriptor file ke deskriptor file lain.

dup2() Sintaks dan Nilai Pengembalian:

Sintaks dari duplikat2() fungsinya adalah:

int dup2(int old_file_descriptor, int new_file_descriptor);

duplikat2() fungsi menyalin deskriptor_file_lama ke dalam new_file_descriptor. jika new_file_descriptor sudah ada, maka secara otomatis ditutup dan kemudian deskriptor_file_lama disalin ke sana.

Pada kesuksesan, duplikat2() fungsi mengembalikan deskriptor file baru. Jika terjadi kesalahan, duplikat2() kembali -1.

Itu duplikat2() fungsi didefinisikan dalam file header unistd.h.

Anda harus menyertakan header unistd.h di file sumber C Anda untuk menggunakan duplikat2() fungsi sebagai berikut:

#termasuk

Untuk informasi lebih lanjut, periksa halaman manual dari duplikat2() dengan perintah berikut:

$ orang dup2

Contoh 1:

Buat file sumber C baru 01_dup2.c dan ketik baris kode berikut di file.

#termasuk
#termasuk
#termasuk
#termasuk
 
int utama(kosong)
int angka1, angka2, jumlah;
 
int input_fds = buka("./memasukkan.txt", O_RDONLY);
 
jika(dup2(input_fds, STDIN_FILENO) < 0)
printf("Tidak dapat menggandakan deskriptor file.");
keluar(EXIT_FAILURE);

 
scanf("%d %d", &angka1, &angka2);
 
jumlah = angka1 + angka2;
 
printf("%d + %d = %d\n", bilangan1, bilangan2, jumlah);
 
kembali EXIT_SUCCESS;

Sekarang, buat file baru memasukkan.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 memasukkan.txt file menggunakan scanf() fungsi, tambahkan dan cetak jumlahnya.

Pertama, saya menyertakan file header yang diperlukan dengan baris kode berikut:.

#termasuk
#termasuk
#termasuk
#termasuk

Dalam utama() fungsi, saya mendefinisikan variabel yang diperlukan.

int angka1, angka2, jumlah;

Kemudian, saya membuka file memasukkan.txt dalam mode hanya baca (O_RDONLY) menggunakan Buka() fungsi dan menyimpan deskriptor file dalam variabel masukan_fds.

int input_fds = buka("./memasukkan.txt", O_RDONLY);

Setelah saya memiliki deskriptor file dari memasukkan.txt file, saya menyalin deskriptor file ke deskriptor file input standar STDIN_FILENO (0) menggunakan duplikat2() fungsi. Deskriptor file dari memasukkan.txt sekarang default stdin deskriptor file.

dup2(input_fds, STDIN_FILENO)

Saya juga bisa menulis duplikat2() fungsinya sebagai berikut. Hasilnya akan sama. STDIN_FILENO memegang nilai 0, yang merupakan nilai stdin deskriptor file.

dup2(input_fds, 0)

Saya juga memeriksa duplikat2() kesalahan dengan baris berikut:. Jika terjadi kesalahan, program diatur untuk mencetak pesan kesalahan dan keluar.

jika(dup2(input_fds, STDIN_FILENO) < 0)
printf("Tidak dapat menggandakan deskriptor file.");
keluar(EXIT_FAILURE);

Kemudian, saya menggunakan scanf() untuk memindai 2 angka dari memasukkan.txt mengajukan.

scanf("%d %d", &angka1, &angka2);

Kemudian, saya menambahkan angka dan mencetak jumlahnya di konsol/terminal, default stdout.

jumlah = angka1 + angka2;
printf("%d + %d = %d\n", bilangan1, bilangan2, jumlah);

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.

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
int utama(kosong)
int angka1, angka2, jumlah;
int input_fds = buka("./memasukkan.txt", O_RDONLY);
int output_fds = buka("./keluaran.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2(input_fds, STDIN_FILENO);
dup2(output_fds, STDOUT_FILENO);
scanf("%d %d", &angka1, &angka2);
jumlah = angka1 + angka2;
printf("%d + %d = %d\n", bilangan1, bilangan2, jumlah);
kembali EXIT_SUCCESS;

Sekarang, buat file baru memasukkan.txt di direktori yang sama dan ketik baris berikut di dalamnya.

15 41

Dalam program ini, saya melakukan hal yang sama seperti di Contoh 1. Satu-satunya perbedaan adalah saya membuat file baru keluaran.txt dan menggunakan deskriptor file keluaran.txt sebagai default stdout deskriptor file menggunakan duplikat2() fungsi. Sekarang, semua output dari printf() fungsi akan ditulis ke keluaran.txt mengajukan.

Saya membuat file baru dan menyimpan deskriptor file di keluaran_fds variabel.

int output_fds = buka("./keluaran.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 ditentukan STDOUT_FILENO.

dup2(output_fds, STDOUT_FILENO);

STDOUT_FILENO mengandung nilai 1 (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 keluaran.txt mengajukan.

Seperti yang Anda lihat, output ditulis ke file keluaran.txt.

Jika Anda ingin menulis semua kesalahan (stderr) ke file lain, maka Anda juga dapat menyalin deskriptor file ke stderr deskriptor file sebagai berikut:.

dup2(error_fds, STDERR_FILENO);

Jadi, begitulah cara Anda menggunakan duplikat2() panggilan sistem di C. Terima kasih telah membaca artikel ini.

Tambahkan gerakan Mouse ke Windows 10 menggunakan alat gratis ini
Dalam beberapa tahun terakhir, komputer dan sistem operasi telah berkembang pesat. Ada saat ketika pengguna harus menggunakan perintah untuk menavigas...
Kontrol & kelola gerakan mouse di antara beberapa monitor di Windows 10
Manajer Mouse Tampilan Ganda memungkinkan Anda mengontrol & mengonfigurasi gerakan mouse di antara beberapa monitor, dengan memperlambat gerakannya di...
WinMouse memungkinkan Anda menyesuaikan & meningkatkan gerakan penunjuk tetikus di PC Windows
Jika Anda ingin meningkatkan fungsi default penunjuk tetikus Anda, gunakan freeware WinMouse. Ini menambahkan lebih banyak fitur untuk membantu Anda m...