Rasm 3.23 Nima bor the pid qiymatlar?
#o'z ichiga oladi < sys/types.h > #include < stdio.h > #include < unistd.h >
#aniqlash SIZE 5
int raqamlar[SIZE] = { 0,1,2,3,4 } ;
int asosiy()
{
int i;
pid t pid;
pid = sanchqi(); agar (pid == 0) {
uchun (i = 0; i < SIZE; i++) {
raqamlar[i] *= - men;
printf("CHILD: %d ",raqamlar[i]); /* LINE X */
}
}
boshqa agar (pid > 0) {
kutish (NULL);
uchun (i = 0; i < SIZE; i++)
printf("OTA-OTA: %d ",raqamlar[i]); /* LINE Y */
}
qaytish 0;
}
Rasm 3.24 Nima chiqish bo'ladi bo'l da Chiziq X va Chiziq Y?
Dasturlash Muammolar
Foydalanish yoki a UNIX yoki a Linux tizimi, yozish a C dastur bu pirovardida zombi jarayoniga aylanadigan bola jarayonini vilkalar. Bu zombi jarayoni kerak qoladi ichida the tizimi uchun da kamida 10 soniya. Jarayon holatlarni buyruqdan olish mumkin
ps - l
The jarayon davlatlar bor ko'rsatilgan quyida the S ustun; jarayonlar bilan a holati _ Z bor zombi. The jarayon identifikator (pid) ning the bola jarayon hisoblanadi PID ustunida , ota - onaningki esa PPID ustunida ko'rsatilgan.
Balki the eng oson yo'l uchun aniqlash bu the bola jarayon hisoblanadi haqiqatan ham a zombi hisoblanadi uchun yugur the dastur bu siz bor yozilgan ichida the fon
( & dan foydalanib) va keyin ps -l buyrug'ini bajaring mavjudligini aniqlash uchun bola hisoblanadi a zombi jarayon. Chunki siz qil emas istayman ham ko'p Tizimda mavjud bo'lgan zombi jarayonlari uchun siz yaratgan narsani olib tashlashingiz kerak bo'ladi. Buning eng oson yo'li - kill yordamida ota-ona jarayonini tugatish buyruq. Misol uchun, agar ota-onaning pidi 4884 bo'lsa, siz kiritasiz
o'ldirish -9 4884
Yozing a C dastur chaqirdi vaqt.c bu belgilaydi the miqdori ning zarur vaqt uchun yugur a buyruq dan the buyruq chiziq. Bu dastur " ./time" sifatida ishga tushiriladi " va belgilangan buyruqni bajarish uchun o'tgan vaqt miqdori haqida xabar beradi. Bu fork() va exec() funktsiyalaridan, shuningdek gettimeofday() funksiyasidan foydalanishni o'z ichiga oladi. the o'tdi vaqt. Bu bo'ladi shuningdek talab qiladi the foydalanish ning ikki boshqacha IPC mexanizmlari.
ko'rsatilganlarni bajaradigan bola jarayonini ajratishdir buyruq. Biroq, oldin the bola amalga oshiradi the buyruq, bu bo'ladi rekord a vaqt tamg'asi ning the joriy vaqt (qaysi biz muddat " Boshlanish vaqti " ). Ota-ona jarayoni bola jarayoni tugashini kutadi. Bir marta the bola tugatadi, the ota-ona bo'ladi rekord the joriy tugash vaqti uchun vaqt tamg'asi. Boshlanish va tugash vaqtlari o'rtasidagi farq ifodalaydi the o'tdi vaqt uchun bajarmoq the buyruq. The Quyidagi misolda ls buyrug'ini bajarish vaqtini bildiradi :
./vaqt ls time.c vaqt
O'tdi vaqt: 0,25422
Ota-ona va bola alohida jarayon bo'lganligi sababli, ular boshlanish vaqtini ular o'rtasida qanday taqsimlashni tartibga solishlari kerak. Siz yozasiz ikki versiyalari ning bu dastur, har biri vakili a boshqacha IPC usuli . _
The birinchi versiya bo'ladi bor the bola jarayon yozish the boshlab vaqt a ga mintaqa ning birgalikda xotira oldin bu qo'ng'iroqlar exec() . Keyin the bola jarayon tugaydi, the ota-ona bo'ladi o'qing the boshlab vaqt dan birgalikda xotira. POSIX umumiy xotirasidan foydalanish tafsilotlari uchun 3.7.1 bo'limiga qarang . O'sha bo'limda, U yerda bor alohida dasturlari uchun the ishlab chiqaruvchi va iste'molchi. Ushbu muammoni hal qilish uchun faqat bitta dastur kerak bo'lganligi sababli, mintaqa birgalikda xotira mumkin bo'l tashkil etilgan oldin the bola jarayon hisoblanadi vilkalar bo'lib, ota-ona va bola jarayonlariga umumiy xotira hududiga kirish imkonini beradi.
Ikkinchi versiyada quvur ishlatiladi. Bola boshlanish vaqtini yozadi uchun the quvur, va the ota-ona bo'ladi o'qing dan bu ergashish the bola jarayonini tugatish.
Joriy vaqt tamg'asini yozish uchun gettimeofday() funksiyasidan foydalanasiz . Bu funktsiya struct timeval ob'ektiga ko'rsatgich uzatiladi , qaysi o'z ichiga oladi ikki a'zolar: tv sek va t usec . Bular 1970-yil 1-yanvardan beri oʻtgan soniyalar va mikrosoniyalar sonini ifodalaydi (ma'lum kabi the UNIX EPOCH ). The ergashish kod namuna qandayligini ko‘rsatadi bu funktsiyasi mumkin bo'l ishlatilgan:
tuzilishi vaqt oqim; gettimeofday(&joriy,NULL);
// current.tv sek ifodalaydi soniya
// current.tv usec ifodalaydi mikrosekundlar
IPC uchun umumiy xotira ko'rsatkichi tarkibiga struktura tayinlanishi mumkin. vaqtni ifodalash the boshlab vaqt. Qachon quvurlar bor ishlatilgan, a ko'rsatgich uchun a struct timeval quyidagiga yozilishi mumkin - va dan o'qing - quvur.
An faoliyat ko'rsatmoqda tizimning pid menejer hisoblanadi mas'ul uchun boshqarish jarayon identifikatorlari. Jarayon birinchi marta yaratilganda, unga pid menejeri tomonidan noyob pid tayinlanadi. Jarayon tugallangandan so'ng pid pid menejeriga qaytariladi va menejer keyinchalik bu pidni qayta tayinlashi mumkin. Jarayon identifikatorlari 3.3.1-bo'limda to'liqroq ko'rib chiqiladi. Bu erda eng muhimi, jarayon identifikatorlari noyob bo'lishi kerakligini tan olishdir; ikkita faol jarayonda bir xil pid bo'lishi mumkin emas.
Mumkin bo'lgan pid qiymatlari oralig'ini aniqlash uchun quyidagi konstantalardan foydalaning :
#aniqlash MIN PID 300 #aniqlash MAX PID 5000
Jarayon identifikatorlarining mavjudligini ko'rsatish uchun siz tanlagan har qanday ma'lumotlar tuzilmasidan foydalanishingiz mumkin. Strategiyalardan biri Linux qilgan narsalarni qabul qilishdir va foydalaning a bitmap ichida qaysi a qiymat ning 0 da pozitsiya i bildiradi bu
i qiymatli jarayon identifikatori mavjud va 1 qiymati jarayon identifikatori hozirda ishlatilayotganligini bildiradi.
Amalga oshirish the ergashish API uchun olish va chiqarish a pid:
int ajratish xarita (bo'sh) - yaratadi va ishga tushiradi a ma'lumotlar tuzilishi _ uchun vakili pids; qaytadi − 1 agar muvaffaqiyatsiz, 1 agar omadli
int ajratish pid (bo'sh) - Ajratadi va qaytadi a pid; qaytadi
− 1 agar qodir emas uchun ajratish a pid (hammasi pid bor ichida foydalanish)
bekor ozod qilish pid (int pid) - Relizlar a pid
Bu dasturlash muammosi tahrir qilinadi keyinroq 4-bob va 6-bobda.
Dostları ilə paylaş: |