MUSTAQIL ISH
Mavzu: Pthread API, Pipe, Fork bibliotekalaridan foydalanib dasturlash.
Bajardi: Norbutayev Bekjaxon
Pthreads nima?
POSIX Threads yoki Pthreads iplar uchun POSIX standartidir. Standart, POSIX.1c, Threads kengaytmalari (IEEE Std 1003.1c-1995) iplarni yaratish va boshqarish uchun APIni belgilaydi.
API ilovalari FreeBSD, NetBSD, GNU/Linux, Mac OS X va Solaris kabi Unix-ga o'xshash ko'plab POSIX tizimlarida mavjud, ammo Microsoft Windows ilovalari ham mavjud. Masalan, pthreads-w32 mavjud va Windows 32-bit platformasi uchun Pthread API quyi to'plamini qo'llab-quvvatlaydi.
POSIX standarti rivojlanishda davom etdi va qayta ko'rib chiqildi, shu jumladan Pthreads spetsifikatsiyasi. Eng so'nggi versiya IEEE Std 1003.1, 2004 nashri sifatida tanilgan.
Pthreads C tilida dasturlash turlari va protsedura chaqiruvlari to'plami sifatida belgilanadi, ular pthread.h sarlavha fayli bilan amalga oshiriladi. GNU/Linux-da pthread funktsiyalari standart C kutubxonasiga kiritilmagan. Ular libpthrea ichida, shuning uchun dasturimizni bog'lash uchun -lpthread qo'shishimiz kerak.
Pthread API
Pthreads API to'rtta guruhga bo'linishi mumkin:
Mavzuni boshqarish:
To'g'ridan-to'g'ri iplar ustida ishlaydigan tartiblar - yaratish, ajratish, qo'shilish va hokazo. Ular shuningdek, qo'shiladigan, rejalashtirish va h.k. kabi ip atributlarini o'rnatish/so'rash funktsiyalarini o'z ichiga oladi.
Mutekslar:
Sinxronizatsiya bilan shug'ullanadigan tartiblar "mutex" deb ataladi, bu "o'zaro istisno" qisqartmasi. Muteks funktsiyalari mutexlarni yaratish, yo'q qilish, qulflash va qulfdan chiqarishni ta'minlaydi. Bular mutexlar bilan bog'langan atributlarni o'rnatuvchi yoki o'zgartiruvchi mutex atribut funksiyalari bilan to'ldiriladi.
Shartli o'zgaruvchilar:
Muteksni baham ko'radigan oqimlar o'rtasidagi aloqalarni hal qiluvchi tartiblar. Dasturchi tomonidan belgilangan shartlarga asoslanadi. Ushbu guruh belgilangan o'zgaruvchan qiymatlar asosida yaratish, yo'q qilish, kutish va signal berish funktsiyalarini o'z ichiga oladi. Shartli o'zgaruvchan atributlarni o'rnatish/so'rash funktsiyalari ham kiritilgan.
Sinxronizatsiya:
O'qish/yozish blokirovkalari va to'siqlarni boshqaradigan tartiblar.
Mavzular yaratish
Bizning main() dasturimiz yagona, sukut bo'yicha ipdir. Boshqa barcha iplar dasturchi tomonidan aniq yaratilgan bo'lishi kerak.
pthread_create yangi ish zarrachasini yaratadi va uni bajariladigan qiladi. Ushbu tartibni kodimiz ichidagi istalgan joydan istalgan ko'p marta chaqirish mumkin.
pthread_create (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) argumentlari:
ip:
Pastki dastur tomonidan qaytarilgan yangi oqim uchun identifikator. Bu pthread_t tuzilishiga ko'rsatgich. Tarmoq yaratilganda, identifikator ushbu o'zgaruvchi ko'rsatadigan xotira joyiga yoziladi. Ushbu identifikator bizga mavzuga murojaat qilish imkonini beradi.
attr:
Tarmoq atributlarini o'rnatish uchun ishlatilishi mumkin bo'lgan atribut ob'ekti. Biz ip atributlari obyektini yoki standart qiymatlar uchun NULLni belgilashimiz mumkin.
start_routine:
Tarmoq yaratilgandan keyin bajariladigan tartib.
bekor *(*start_routine)(void *)
Biz funktsiyaning manzilini parametr sifatida bekor qilish uchun ko'rsatgichni o'tkazishimiz kerak va funktsiya ko'rsatgichni void holatiga qaytaradi. Shunday qilib, biz bitta argumentning istalgan turini o'tkazishimiz va ko'rsatgichni istalgan turga qaytarishimiz mumkin.
Fork() dan foydalanish boshqa qaytish kodi bilan bir xil joyda bajarilishini davom ettirishga olib keladi, yangi ipdan foydalanish yangi ish zarrachalari ishga tushishi kerak bo'lgan funktsiyaga aniq ko'rsatgich beradi.
arg:
start_routine ga o'tkazilishi mumkin bo'lgan yagona argument. U bo'sh ko'rsatkich sifatida o'tkazilishi kerak. Hech qanday argument o'tkazilmasa, NULL ishlatilishi mumkin.
C fork() va pipe() ni namoyish qilish dasturi
• Qiyinchilik darajasi : O'rta
• Oxirgi yangilangan: 03-yanvar, 2022-yil
fork() bola jarayonini yaratish uchun ishlatiladi. Bu bola jarayoni asl(ota-ona) jarayonning nusxasidir. Bu Unix-ga o'xshash operatsion tizimlarda jarayon yaratishning asosiy usuli hisoblanadi. (Ma'lumot uchun ushbu maqolaga qarang).
Sintaksis:
sanchqi();
// Hech qanday parametr qabul qilmaydi, qaytaradi
// butun qiymatlar. Salbiy qaytishi mumkin,
// musbat yoki nol butun son qiymatlari.
pipe(): Linuxda jarayonlararo aloqa uchun ishlatiladi. Bu tizim funktsiyasi. (Ma'lumot uchun ushbu maqolaga qarang)
Sintaksis:
int quvuri (int pipefd [2]);
Fork() va pipe() ni namoyish qilish uchun C dasturi:
Ikkita P1 va P2 jarayonlarini yaratish uchun Linux C dasturini yozing. P1 satrni oladi va uni P2 ga uzatadi. P2 qabul qilingan satrni string funktsiyasidan foydalanmasdan boshqa satr bilan birlashtiradi va uni chop etish uchun P1 ga qaytarib yuboradi.
Misollar:
Boshqa qator: forgeeks.org
Kirish: www.geeks
Natija: www.geeksforgeeks.org
Kirish: www.practice.geeks
Natija: Practice.geeksforgeeks.org
Tavsiya etiladi: Iltimos, yechimga o‘tishdan avval, {IDE} da o‘z yondashuvingizni sinab ko‘ring.
Tushuntirish:
• Bola jarayonini yaratish uchun biz fork() dan foydalanamiz. fork() qaytaradi:
• <0 bola (yangi) jarayonni yarata olmadi
• Bola jarayoni uchun =0
• >0, ya'ni bola jarayonining asosiy jarayonga jarayon identifikatori. Qachon >0 ota-ona jarayoni bajariladi.
• pipe() axborotni bir jarayondan ikkinchisiga o'tkazish uchun ishlatiladi. pipe() bir yo'nalishli, shuning uchun jarayonlar o'rtasidagi ikki tomonlama aloqa uchun har bir yo'nalish uchun bittadan ikkita quvur o'rnatilishi mumkin.
Misol:
int fd[2];
quvur (fd);
fd[0]; //-> o'qish oxirida foydalanish uchun
fd[1]; //-> yozish oxirida foydalanish uchun
Ota-ona jarayoni ichida: Biz birinchi trubaning (fd1[0]) o'qish uchini yopamiz, so'ngra trubaning yozma uchi (fd1[1]) qatorini yozamiz. Endi ota-ona bola jarayoni tugashini kutadi. Bola jarayonidan so'ng, ota-ona ikkinchi trubaning (fd2 [1]) yozish uchini yopadi va trubaning o'qish uchi (fd2 [0]) orqali satrni o'qiydi.
Inside Child Process : Bola trubaning yozish uchini (fd1 [1]) yopish orqali ota-ona jarayoni tomonidan yuborilgan birinchi qatorni o'qiydi va o'qigandan so'ng ikkala qatorni birlashtiradi va satrni fd2 trubkasi orqali asosiy jarayonga o'tkazadi va undan chiqadi.
Kiritish
www.geeks
• C
// Fork() va pipe() dan foydalanishni ko'rsatish uchun C dasturi
#include
#include
#include
#include
#include
#include
int main()
{
// Biz ikkita quvurdan foydalanamiz
// Ota-onadan kirish satrini yuborish uchun birinchi quvur
// Boladan birlashtirilgan qatorni yuborish uchun ikkinchi quvur
int fd1[2]; // Birinchi quvurning ikkita uchini saqlash uchun ishlatiladi
int fd2[2]; // Ikkinchi quvurning ikkita uchini saqlash uchun ishlatiladi
char fixed_str[] = "forgeeks.org";
char input_str[100];
pid_t p;
agar (quvur (fd1) == -1) {
fprintf(stderr, "Quvur muvaffaqiyatsiz tugadi");
qaytish 1;
}
agar (quvur (fd2) == -1) {
fprintf(stderr, "Quvur muvaffaqiyatsiz tugadi");
qaytish 1;
}
scanf("%s", kirish_str);
p = sanchqi();
agar (p < 0) {
fprintf(stderr, "vilka muvaffaqiyatsiz tugadi");
qaytish 1;
}
// Ota-ona jarayoni
Aks holda (p > 0) {
char concat_str[100];
yopish(fd1[0]); // Birinchi quvurning o'qish uchini yoping
// Kirish qatorini yozing va birinchisining yozish oxirini yoping
// quvur.
write(fd1[1], input_str, strlen(input_str) + 1);
yopish(fd1[1]);
// Bolaning satr yuborishini kuting
kuting (NULL);
yopish(fd2[1]); // Ikkinchi trubaning yozish uchini yoping
// Boladan satrni o'qing, chop eting va yoping
// o'qish oxiri.
o'qing(fd2[0], concat_str, 100);
printf("Birlashtirilgan string %s\n", concat_str);
yopish(fd2[0]);
}
// bola jarayoni
boshqa {
yopish(fd1[1]); // Birinchi trubaning yozish uchini yoping
// Birinchi quvur yordamida satrni o'qing
char concat_str[100];
o'qing(fd1[0], concat_str, 100);
// Ruxsat etilgan satrni u bilan birlashtiring
int k = strlen (concat_str);
int i;
uchun (i = 0; i < strlen(fixed_str); i++)
concat_str[k++] = fixed_str[i];
concat_str[k] = '\0'; // satr '\0' bilan tugaydi
// Ikkala o'qish oxirini yoping
yopish(fd1[0]);
yopish(fd2[0]);
// Birlashtirilgan qatorni yozing va yozish oxirini yoping
write(fd2[1], concat_str, strlen(concat_str) + 1);
yopish(fd2[1]);
chiqish (0);
}
}
Chiqish:
Birlashtirilgan satr www.geeksforgeeks.org
Ushbu maqola Kartik Ahuja tomonidan kiritilgan. Agar sizga GeeksforGeeks yoqsa va o'z hissangizni qo'shmoqchi bo'lsangiz, write.geeksforgeeks.org dan foydalanib maqola yozishingiz yoki maqolangizni review-team@geeksforgeeks.org manziliga yuborishingiz mumkin. Maqolangizni GeeksforGeeks bosh sahifasida ko'ring va boshqa Geeksga yordam bering. Agar biror narsa noto'g'ri bo'lsa yoki yuqorida muhokama qilingan mavzu haqida ko'proq ma'lumot almashishni istasangiz, sharhlaringizni yozing.0>
Do'stlaringiz bilan baham: |