Pengaturcaraan C

dup2 Panggilan Sistem di C

dup2 Panggilan Sistem di C
The dup2 () fungsi sistem digunakan untuk membuat salinan deskriptor fail yang ada. Di Linux, terdapat 3 deskriptor fail standard. Mereka adalah:

stdin: Ini adalah deskriptor fail input standard. Ia digunakan untuk mengambil input dari terminal secara lalai. scanf (), dapatkan () fungsi dll menggunakan stdin deskriptor fail untuk mengambil input pengguna. The stdin deskriptor fail juga diwakili oleh nombor 0.

stdout: Ini adalah deskriptor fail output standard. Ia digunakan untuk mencetak sesuatu ke konsol / terminal secara lalai. Digunakan secara meluas printf () kegunaan fungsi stdout untuk mencetak output yang anda kehendaki ke konsol / terminal. The stdout deskriptor fail juga diwakili oleh nombor 1.

stderr: Ini adalah deskriptor fail ralat standard. Ia melakukan perkara yang sama seperti stdout penerangan fail. The stderr deskriptor fail digunakan untuk mencetak mesej ralat pada konsol / terminal. Satu-satunya perbezaan adalah jika anda menggunakan stderr deskriptor fail untuk mencetak mesej ralat, dan stdout deskriptor fail untuk mencetak output biasa, kemudian anda boleh memisahkannya kemudian. Sebagai contoh, anda boleh mengalihkan mesej ralat ke fail dan output biasa ke konsol atau fail lain. The stderr deskriptor fail juga diwakili oleh nombor 2.

Selain daripada 3 deskriptor fail ini, anda boleh membuat deskriptor fail tambahan di C. Untuk membuat deskriptor fail baru, anda boleh menggunakan buka() berfungsi di C. The buka() fungsi membuka fail baru, membuat deskriptor fail untuk fail itu dan melampirkan nombor selain 0, 1, 2 ke deskriptor fail.

Sebaik sahaja anda membuka fail menggunakan buka() fungsi, anda boleh menggunakan baca () dan tulis () berfungsi membaca dan menulis kepada deskriptor fail yang baru dibuat.

Sekarang, bayangkan situasi di mana anda ingin membaca dari fail tertentu menggunakan scanf () atau dapatkan () berfungsi dan tulis ke fail lain menggunakan printf () fungsi. Ini bukan tingkah laku lalai dari scanf (), dapatkan () dan printf () berfungsi seperti yang saya jelaskan sebelumnya. Secara lalai, scanf () dan dapatkan () kegunaan fungsi stdin dan printf () kegunaan stdout dan tidak ada cara untuk memberitahu fungsi-fungsi ini untuk menggunakan deskriptor fail lain. Jadi, untuk mengubah tingkah laku lalai ini, anda harus mengganti stdin dan stdout deskriptor fail dengan deskriptor fail yang anda mahukan. Inilah yang dup2 () fungsi sistem tidak. The dup2 () fungsi menyalin deskriptor fail ke deskriptor fail lain.

dup2 () Nilai Sintaks dan Pulangan:

Sintaks bagi dup2 () fungsi adalah:

int dup2 (int old_file_descriptor, int new_file_descriptor);

dup2 () fungsi menyalin old_file_descriptor ke dalam penerangan_file_ baru. Sekiranya deskripsi_file baru sudah ada, maka secara automatik ditutup dan kemudian old_file_descriptor disalin kepadanya.

Pada kejayaan, yang dup2 () fungsi mengembalikan deskriptor fail baru. Sekiranya berlaku ralat, dup2 () kembali -1.

The dup2 () fungsi ditentukan dalam fail header tidak terkawal.h.

Anda mesti memasukkan pengepala tidak terkawal.h dalam fail sumber C anda untuk menggunakan dup2 () berfungsi seperti berikut:

#sertakan

Untuk maklumat lebih lanjut, periksa halaman lelaki di dup2 () dengan arahan berikut:

$ lelaki dup2

Contoh 1:

Buat fail sumber C baru 01_dup2.c dan taipkan baris kod berikut dalam fail.

#sertakan
#sertakan
#sertakan
#sertakan
 
int utama (tidak sah)
int nombor1, nombor2, jumlah;
 
int input_fds = terbuka ("./ input.txt ", O_RDONLY);
 
jika (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Tidak dapat menduplikasi deskriptor fail.");
jalan keluar (EXIT_FAILURE);

 
scanf ("% d% d", & number1, & number2);
 
jumlah = nombor1 + nombor2;
 
printf ("% d +% d =% d \ n", nombor1, nombor2, jumlah);
 
pulangkan EXIT_SUCCESS;

Sekarang, buat fail baru input.txt dalam direktori yang sama dan taipkan baris berikut di dalamnya.

15 41

Objektif utama program ini adalah untuk membaca 2 nombor bulat dari input.txt fail menggunakan scanf () fungsi, tambahnya dan cetak jumlahnya.

Pertama, saya memasukkan fail tajuk yang diperlukan dengan baris kod berikut.

#sertakan
#sertakan
#sertakan
#sertakan

Di dalam utama () fungsi, saya menentukan pemboleh ubah yang diperlukan.

int nombor1, nombor2, jumlah;

Kemudian, saya membuka fail tersebut input.txt dalam mod baca sahaja (O_RDONLY) menggunakan buka() berfungsi dan menyimpan deskriptor fail dalam pemboleh ubah input_fds.

int input_fds = terbuka ("./ input.txt ", O_RDONLY);

Sebaik sahaja saya mempunyai deskriptor fail input.txt fail, saya menyalin deskriptor fail ke deskriptor fail input standard STDIN_FILENO (0) menggunakan dup2 () fungsi. Penerangan fail dari input.txt kini menjadi lalai stdin penerangan fail.

dup2 (input_fds, STDIN_FILENO)

Saya juga boleh menulis dup2 () berfungsi seperti berikut. Hasilnya akan sama. STDIN_FILENO memegang nilai 0, yang merupakan nilai stdin penerangan fail.

dup2 (input_fds, 0)

Saya juga memeriksa dup2 () ralat dengan baris berikut. Sekiranya kesalahan berlaku, program diatur untuk mencetak pesan kesalahan dan keluar.

jika (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Tidak dapat menduplikasi deskriptor fail.");
jalan keluar (EXIT_FAILURE);

Kemudian, saya gunakan scanf () untuk mengimbas 2 nombor dari input.txt fail.

scanf ("% d% d", & number1, & number2);

Kemudian, saya menambah nombor dan mencetak jumlahnya di konsol / terminal, lalai stdout.

jumlah = nombor1 + nombor2;
printf ("% d +% d =% d \ n", nombor1, nombor2, jumlah);

Seperti yang anda lihat, saya mendapat output yang diharapkan setelah saya menjalankan program ini.

Contoh 2:

Buat fail sumber C baru 02_dup2.c dan taipkan baris kod berikut dalam fail.

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan
#sertakan
int utama (tidak sah)
int nombor1, nombor2, jumlah;
int input_fds = terbuka ("./ input.txt ", O_RDONLY);
int output_fds = terbuka ("./pengeluaran.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & number1, & number2);
jumlah = nombor1 + nombor2;
printf ("% d +% d =% d \ n", nombor1, nombor2, jumlah);
pulangkan EXIT_SUCCESS;

Sekarang, buat fail baru input.txt dalam direktori yang sama dan taipkan baris berikut di dalamnya.

15 41

Dalam program ini, saya melakukan perkara yang sama seperti di Contoh 1. Satu-satunya perbezaan ialah saya membuat fail baru pengeluaran.txt dan menggunakan deskriptor fail output.txt sebagai lalai stdout penerangan fail menggunakan dup2 () fungsi. Sekarang, semua output dari printf () fungsi akan ditulis ke pengeluaran.txt fail.

Saya membuat fail baru dan menyimpan deskriptor fail di output_fds pemboleh ubah.

int output_fds = terbuka ("./pengeluaran.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Saya juga menyalin deskriptor output_fds ke deskriptor fail stdout. Saya menggunakan pemalar yang telah ditentukan STDOUT_FILENO.

dup2 (output_fds, STDOUT_FILENO);

STDOUT_FILENO mengandungi nilai 1 (nilai deskriptor fail lalai stdout). Jadi, saya dapat menulis semula panggilan fungsi dup2 () seperti berikut. Ini akan memberikan hasil yang sama.

dup2 (output_fds, 1);

Selebihnya program adalah sama. Seperti yang anda lihat, setelah saya menjalankan program, program ini tidak mencetak apa-apa di konsol / terminal.

Tetapi, program itu membuat fail baru pengeluaran.txt fail.

Seperti yang anda lihat, output ditulis ke fail pengeluaran.txt.

Sekiranya anda ingin menulis semua kesalahan (stderrke fail lain, maka anda juga boleh menyalin deskriptor fail ke stderr penerangan fail seperti berikut.

dup2 (error_fds, STDERR_FILENO);

Jadi, itulah cara anda menggunakan dup2 () panggilan sistem di C. Terima kasih kerana membaca artikel ini.

Permainan Makmal Apl Oculus Teratas
Sekiranya anda adalah pemilik alat dengar Oculus, maka anda mesti mengetahui tentang memuatkan sideload. Sideloading adalah proses memasang kandungan ...
10 Permainan Teratas untuk Dimainkan di Ubuntu
Platform Windows telah menjadi salah satu platform dominan untuk permainan kerana peratusan besar permainan yang sedang berkembang hari ini untuk meny...
5 Permainan Arcade Terbaik untuk Linux
Pada masa kini, komputer adalah mesin serius yang digunakan untuk permainan. Sekiranya anda tidak dapat memperoleh skor tinggi baru, anda akan tahu ma...