Pemrograman C

POSIX Spawn dengan Pemrograman C

POSIX Spawn dengan Pemrograman C
Spawn adalah fungsi yang digunakan dalam POSIX untuk memuat dan menjalankan proses anak. Proses yang sedang berjalan di POSIX kemudian akan melanjutkan atau tidak melanjutkan proses anak ini dan proses lainnya secara tidak sinkronsynchronous. Setiap kali sub-proses baru dibuat, diperlukan beberapa memori khusus yang akan memungkinkan proses induk dan anak untuk dieksekusi. Di Microsoft Windows, UNIX, dan Linux, ada keluarga spawn tertentu; dan keluarga fungsi spawn lainnya dianggap sebagai ekstensi opsional.

Mengapa Menggunakan POSIX Spawn?

Itu posix_spawn() dan posix_spawnp() fungsi keduanya digunakan untuk membuat proses anak baru. Proses anak kemudian mengeksekusi file. Fungsi-fungsi ini ditentukan oleh POSIX untuk menstandardisasi metode pembuatan proses baru untuk mesin yang tidak memiliki dukungan fork system call. Mesin ini biasanya kecil dan tidak memiliki sistem tertanam untuk dukungan lMMU.

Kedua fungsi tersebut menggabungkan fork dan exec, dengan beberapa langkah tambahan yang akan mengeksekusi anak. Mereka bertindak sebagai bagian dari fungsionalitas, biasanya dicapai dengan garpu, untuk semua panggilan sistem dan sistem tertanam yang tidak memiliki fungsionalitas seperti itu.

Contoh 1: posix_spawn()

Dalam contoh ini, kita akan menggunakan fungsi spawn () untuk membuat dan menjalankan proses anak baru. Kemudian, kami akan menjelaskan semua argumen yang relevan yang digunakan dalam fungsi.

Argumen yang digunakan dalam contoh adalah sebagai berikut:

Argumen Deskripsi
Digunakan untuk mendefinisikan semua spawn yang melakukan operasi.
jalan Nama jalur yang akan dieksekusi.
fd_count Jumlah entri dengan larik fd_map. Jika fd_count sama dengan 0, maka fd_map diabaikan. Dalam kasus seperti itu, proses anak mewarisi semua deskriptor file, mengabaikan yang telah dimodifikasi.
fd_map
Array deskriptor file yang akan diwarisi oleh proses anak. Di sini, jika nilai fd_count bukan 0, maka fd_map diperlukan untuk membawa deskriptor file fd_count ke nilai tertinggi OPEN_MAX. Memiliki:

·      Anak memproses masukan

· Hasil

·      Nilai kesalahan

mewarisi Warisan struct menunjukkan bahwa pengguna ingin proses anak mereka mewarisi semuanya dari orang tua.
argv Pointer ke vektor argumen tertentu. Nilai argv[0] tidak boleh NULL dan harus berupa nama file yang sedang dimuat. Nilai argv tidak boleh sama dengan NULL.
envp Menunjuk ke array pointer karakter. Setiap pointer dalam array ini menunjuk ke variabel lingkungan. Titik akhir dari array adalah pointer NULL.

Contoh 2: tes.c

Dalam contoh berikut, proses anak baru dibuat untuk menjalankan perintah dengan: /bin/sh -c. Ini adalah nilai yang diberikan sebagai argumen pertama. Itu uji.c kodenya adalah sebagai berikut:

Dalam contoh di atas, kami memanggil perpustakaan, lalu disebut muncul.h header. Anda juga akan melihat posix_spawn() dipanggil untuk membuat proses anak dalam contoh di atas. Itu muncul dan spawnp fungsi digunakan sebagai pengganti garpu dan eksekutif fungsi. Muncul() memiliki fleksibilitas dan memberikan banyak kemudahan kepada pengguna dalam banyak hal. Ini sedikit berbeda dari sistem() dan eksekutif(). Ini akan kembali dan membuat proses anak baru. Dalam contoh kita, itu adalah pid. Di atas, Anda dapat melihat bahwa fungsi menunggu tunggu(), kemudian sistem() digunakan. Perhatikan bahwa muncul() dan garpu() proses pemanggilannya sama, dan metode implementasinya kurang lebih sama untuk kedua fungsi.

Kami sekarang akan menjalankan contoh menggunakan a gcc penyusun. Anda juga dapat menggunakan kompiler lain pilihan Anda:

$ sudo tes gcc.c -lrt

Selanjutnya, jalankan yang berikut ini:

$ ./Sebuah.di luar

Output dari perintah di atas akan terlihat sebagai berikut:

Anak pid akan dibuat, seperti yang Anda lihat pada output di atas.

Perpustakaan

Libc: Gunakan -l c untuk menautkan gcc penyusun. Di sini, perhatikan bahwa perpustakaan ini disertakan secara otomatis.

Muncul()

Itu muncul() fungsi didasarkan pada POSIX 1003.Standar draft 1d digunakan sebagai posix_spawn(). Pustaka C menyertakan fungsi spawn*(). Di sini, kami akan membuat daftar beberapa sufiks, beserta deskripsinya:

e: digunakan sebagai array untuk variabel lingkungan.

aku: digunakan sebagai daftar argumen yang diakhiri dengan NULL yang digunakan di dalam program.

hal: digunakan untuk mendefinisikan jalur relatif. Jika jalur tidak memiliki garis miring pada nilainya, maka sistem menggunakan dan mencari variabel lingkungan PATH untuk program serupa.

v: bertindak sebagai vektor argumen di dalam program.

Pemetaan File Deskriptor

Di muncul(), kita berlatih fd_count dan fd_map argumen untuk memanggil deskriptor file. Ini menentukan anak mana yang akan diwarisi.

Nomor yang digunakan sebagai deskriptor file untuk proses anak tergantung pada lokasinya di dalam fd_map. Di sini, kami akan mempertimbangkan contoh induk dengan deskriptor file bernilai 1, 3, dan 5, maka pemetaannya akan menjadi seperti ini:

>> int fd_map = 1, 3, 5 ;
Untuk anak Untuk orang tua
0 1
1 3
2 5

Perhatikan bahwa jika Anda menggunakan eksplisit fd_map untuk mencocokkan deskriptor file ini dengan anak dan orang tua, maka Anda harus memetakan SPWAN_FDCLOSE berfungsi untuk melanjutkan.

Bendera Warisan

Di Spawn, pengguna harus memanggil salah satu dari flag berikut jika terjadi pewarisan. Beberapa contoh bendera Spawn dan deskripsinya diberikan di bawah ini:

Bendera Deskripsi
SPAWN_ALIGN_DEFAULT Bendera ini digunakan untuk mengatur pengaturan default pengaturan untuk penyelarasan.
SPAWN_ALIGN_FAULT Bendera ini digunakan untuk kesalahan penyelarasan referensi data.
SPAWN_ALIGN_NOFAULT Bendera ini digunakan untuk memperbaiki kesalahan ketidaksejajaran.
SPAWN_DEBUG Bendera ini digunakan untuk men-debug kernel.
SPAWN_EXEC SPAWN bertindak seperti exec*() menggunakan flag ini.
SPAWN_EXPLICIT_CPU Bendera ini digunakan untuk mengatur run mask dan mewarisi mask=run mask member.
SPAWN_EXPLICIT_SCHED Bendera ini digunakan untuk mengatur kebijakan penjadwalan.

Itu <muncul.h> mendefinisikan topeng itu SPAWN_ALIGN_MASK digunakan untuk menyelaraskan bendera yang tercantum di atas.

pid_t pgrup Grup proses turunan jika Anda menentukan SPAWN_SETGROUP di anggota bendera.
int runmask Runmask dari proses anak untuk mewarisi topeng yang disepakati berdasarkan nilai anggota ini.
sigset_t sigmask Masker sinyal untuk proses anak yang digunakan untuk menentukan status anggota bendera.
sigset_t sigdefault Himpunan proses anak dari sinyal default.

kesalahan

Itu posix_spawn() dan posix_spawnp() fungsi juga dapat gagal dalam beberapa kasus, seperti berikut ini:

ENVAL: Ini adalah kasus ketika nilai yang diidentifikasi oleh file_actions atau attrp tidak tepat dan memadai.

Ketika panggilan garpu (2), garpu (2), atau klon (2) yang mendasarinya gagal, muncul() fungsi akan mengembalikan nomor kesalahan.

ENOSIS: Hal ini terjadi jika fungsi dan dukungannya tidak disertakan atau disediakan dalam suatu sistem.

Kesimpulan

Tutorial ini membahas fungsionalitas dasar yang disediakan oleh POSIX_spawn() dan fungsi yang digunakan olehnya untuk menjalankan dan menjalankan fungsinya. Kami juga membahas flag dan error yang biasa digunakan oleh Spawn.

Mesin Game Gratis dan Sumber Terbuka untuk Mengembangkan Game Linux
Artikel ini akan membahas daftar mesin game sumber terbuka dan gratis yang dapat digunakan untuk mengembangkan game 2D dan 3D di Linux. Ada banyak mes...
Shadow of the Tomb Raider untuk Tutorial Linux
Shadow of the Tomb Raider adalah tambahan kedua belas untuk seri Tomb Raider - waralaba game aksi-petualangan yang dibuat oleh Eidos Montreal. Permain...
Cara Meningkatkan FPS di Linux?
FPS adalah singkatan dari Bingkai per detik. Tugas FPS adalah mengukur kecepatan bingkai dalam pemutaran video atau pertunjukan game. Dengan kata sede...