ఫోర్క్ సిస్టమ్ కాల్ లైనక్స్

Fork System Call Linux



ఫోర్క్ సిస్టమ్ కాల్ కొత్త ప్రక్రియలను సృష్టించడానికి ఉపయోగించబడుతుంది. కొత్తగా సృష్టించబడిన ప్రక్రియ పిల్లల ప్రక్రియ. ఫోర్క్‌ను పిలిచే ప్రక్రియ మరియు కొత్త ప్రక్రియను సృష్టించడం అనేది మాతృ ప్రక్రియ. పిల్లల మరియు మాతృ ప్రక్రియలు ఏకకాలంలో అమలు చేయబడతాయి.

కానీ పిల్లలు మరియు మాతృ ప్రక్రియలు వేర్వేరు మెమరీ ప్రదేశాలలో ఉంటాయి. ఈ మెమరీ ఖాళీలు ఒకే కంటెంట్‌ని కలిగి ఉంటాయి మరియు ఒక ప్రక్రియ ద్వారా చేసే ఏవైనా ఆపరేషన్ మరొక ప్రక్రియను ప్రభావితం చేయదు.







పిల్లల ప్రక్రియలు సృష్టించబడినప్పుడు; ఇప్పుడు రెండు ప్రక్రియలకు ఒకే ప్రోగ్రామ్ కౌంటర్ (PC) ఉంటుంది, కాబట్టి ఈ రెండు ప్రక్రియలు ఒకే తదుపరి సూచనను సూచిస్తాయి. మాతృ ప్రక్రియ ద్వారా తెరవబడిన ఫైల్‌లు పిల్లల ప్రక్రియకు సమానంగా ఉంటాయి.



చైల్డ్ ప్రాసెస్ దాని పేరెంట్‌తో సమానంగా ఉంటుంది కానీ ప్రాసెస్ ఐడిలో తేడా ఉంది:



  1. చైల్డ్ ప్రాసెస్ యొక్క ప్రాసెస్ ఐడి అనేది ఒక ప్రత్యేకమైన ప్రాసెస్ ఐడి, ఇది ప్రస్తుతం ఉన్న అన్ని ఇతర ప్రాసెస్‌ల ఐడికి భిన్నంగా ఉంటుంది.
  2. తల్లిదండ్రుల ప్రాసెస్ ID పిల్లల పేరెంట్ యొక్క ప్రాసెస్ ID వలె ఉంటుంది.

పిల్లల ప్రక్రియ యొక్క లక్షణాలు

పిల్లల ప్రక్రియ కలిగి ఉన్న కొన్ని లక్షణాలు క్రిందివి:





  1. CPU కౌంటర్లు మరియు వనరుల వినియోగాలు సున్నాకి రీసెట్ చేయడానికి ప్రారంభించబడ్డాయి.
  2. మాతృ ప్రక్రియ ముగిసినప్పుడు, పిల్లల ప్రక్రియలకు సిగ్నల్ అందదు ఎందుకంటే prctl () లో PR_SET_PDEATHSIG లక్షణం రీసెట్ చేయబడుతుంది.
  3. ఫోర్క్ () కాల్ చేయడానికి ఉపయోగించే థ్రెడ్ పిల్లల ప్రక్రియను సృష్టిస్తుంది. కాబట్టి పిల్లల ప్రక్రియ యొక్క చిరునామా తల్లిదండ్రుల చిరునామా వలె ఉంటుంది.
  4. మాతృ ప్రక్రియ యొక్క ఫైల్ డిస్క్రిప్టర్ పిల్లల ప్రక్రియ ద్వారా వారసత్వంగా పొందబడుతుంది. ఉదాహరణకు ఫైల్ ఆఫ్‌సెట్ లేదా జెండాల స్థితి మరియు I/O గుణాలు పిల్లల మరియు మాతృ ప్రక్రియల ఫైల్ డిస్క్రిప్టర్‌ల మధ్య భాగస్వామ్యం చేయబడతాయి. కాబట్టి పేరెంట్ క్లాస్ యొక్క ఫైల్ డిస్క్రిప్టర్ చైల్డ్ క్లాస్ యొక్క అదే ఫైల్ డిస్క్రిప్టర్‌ని సూచిస్తుంది.
  5. మాతృ ప్రక్రియ యొక్క ఓపెన్ మెసేజ్ క్యూ డిస్క్రిప్టర్లు పిల్లల ప్రక్రియ ద్వారా వారసత్వంగా పొందబడతాయి. ఉదాహరణకు ఒక ఫైల్ డిస్క్రిప్టర్ మాతృ ప్రక్రియలో సందేశాన్ని కలిగి ఉంటే, అదే సందేశం పిల్లల ప్రక్రియ యొక్క సంబంధిత ఫైల్ డిస్క్రిప్టర్‌లో ఉంటుంది. కాబట్టి ఈ ఫైల్ డిస్క్రిప్టర్‌ల ఫ్లాగ్ విలువలు ఒకే విధంగా ఉన్నాయని మనం చెప్పగలం.
  6. అదేవిధంగా ఓపెన్ డైరెక్టరీ స్ట్రీమ్‌లు పిల్లల ప్రక్రియల ద్వారా సంక్రమించబడతాయి.
  7. చైల్డ్ క్లాస్ యొక్క డిఫాల్ట్ టైమర్ స్లాక్ విలువ మాతృ తరగతి యొక్క ప్రస్తుత టైమర్ స్లాక్ విలువ వలె ఉంటుంది.

పిల్లల ప్రక్రియ ద్వారా సంక్రమించని లక్షణాలు

పిల్లల ప్రక్రియ ద్వారా సంక్రమించని కొన్ని లక్షణాలు ఈ క్రింది విధంగా ఉన్నాయి:

  1. మెమరీ లాక్స్
  2. చైల్డ్ క్లాస్ యొక్క పెండింగ్ సిగ్నల్ ఖాళీగా ఉంది.
  3. సంబంధిత రికార్డ్ లాక్‌లను ప్రాసెస్ చేయండి (fcntl ())
  4. అసమకాలిక I/O కార్యకలాపాలు మరియు I/O విషయాలు.
  5. డైరెక్టరీ మార్పు నోటిఫికేషన్‌లు.
  6. అలారం (), సెటిటైమర్ () వంటి టైమర్‌లు పిల్లల తరగతి వారసత్వంగా పొందవు.

సి లో ఫోర్క్ ()

ఫోర్క్ () లో వాదనలు లేవు మరియు ఫోర్క్ () యొక్క రిటర్న్ రకం పూర్ణాంకం. ఫోర్క్ () ఉపయోగించినప్పుడు మీరు క్రింది హెడర్ ఫైల్‌లను చేర్చాలి:



#చేర్చండి
#చేర్చండి
#చేర్చండి

ఫోర్క్ () తో పనిచేసేటప్పుడు, రకం కోసం ఉపయోగించవచ్చు pid_t ప్రక్రియల ID కొరకు pid_t లో నిర్వచించబడింది.

హెడర్ ఫైల్ అనేది ఫోర్క్ () నిర్వచించబడినది కాబట్టి మీరు ఫోర్క్ () ను ఉపయోగించడానికి మీ ప్రోగ్రామ్‌లో చేర్చాలి.

రిటర్న్ రకం నిర్వచించబడింది మరియు ఫోర్క్ () కాల్ లో నిర్వచించబడింది. అందువల్ల, ఫోర్క్ () సిస్టమ్ కాల్ ఉపయోగించడానికి మీరు మీ ప్రోగ్రామ్‌లో రెండింటినీ చేర్చాలి.

ఫోర్క్ సింటాక్స్ ()

లైనక్స్, ఉబుంటులో ఫోర్క్ () సిస్టమ్ కాల్ యొక్క వాక్యనిర్మాణం క్రింది విధంగా ఉంది:

పిడ్_టి ఫోర్క్ (శూన్యం);

వాక్యనిర్మాణంలో రిటర్న్ రకం pid_t . పిల్లల ప్రక్రియ విజయవంతంగా సృష్టించబడినప్పుడు, పిల్లల ప్రక్రియ యొక్క PID మాతృ ప్రక్రియలో తిరిగి వస్తుంది మరియు 0 పిల్లల ప్రక్రియకు తిరిగి వస్తుంది.

ఏదైనా లోపం ఉంటే -1 మాతృ ప్రక్రియకు తిరిగి వస్తుంది మరియు పిల్లల ప్రక్రియ సృష్టించబడదు.

No arguments are passed to fork(). 

ఉదాహరణ 1: కాలింగ్ ఫోర్క్ ()

కొత్త పిల్లల ప్రక్రియను సృష్టించడానికి మేము ఫోర్క్ () సిస్టమ్ కాల్‌ని ఉపయోగించిన కింది ఉదాహరణను పరిగణించండి:

కోడ్:

#చేర్చండి
#చేర్చండి
#చేర్చండి

intప్రధాన()
{
ఫోర్క్();
printf (ఫోర్క్ () సిస్టమ్ కాల్ ఉపయోగించి n');
తిరిగి 0;
}

అవుట్‌పుట్:

ఫోర్క్ () సిస్టమ్ కాల్ ఉపయోగించి
ఫోర్క్ () సిస్టమ్ కాల్ ఉపయోగించి

ఈ కార్యక్రమంలో, మేము ఫోర్క్ () ఉపయోగించాము, ఇది కొత్త పిల్లల ప్రక్రియను సృష్టిస్తుంది. పిల్లల ప్రక్రియ సృష్టించబడినప్పుడు, మాతృ ప్రక్రియ మరియు పిల్లల ప్రక్రియ రెండూ తదుపరి సూచనలను సూచిస్తాయి (అదే ప్రోగ్రామ్ కౌంటర్). ఈ విధంగా మిగిలిన సూచనలు లేదా సి స్టేట్‌మెంట్‌లు మొత్తం ప్రాసెస్ సమయాల సంఖ్యను అమలు చేస్తాయి, అంటే 2ఎన్సార్లు, ఇక్కడ n అనేది ఫోర్క్ () సిస్టమ్ కాల్‌ల సంఖ్య.

కాబట్టి ఫోర్క్ () కాల్ పైన పేర్కొన్న విధంగా ఒకసారి ఉపయోగించినప్పుడు (21= 2) మా అవుట్‌పుట్ 2 సార్లు ఉంటుంది.

ఇక్కడ ఫోర్క్ () సిస్టమ్ కాల్ ఉపయోగించినప్పుడు, అంతర్గత నిర్మాణం ఇలా కనిపిస్తుంది:

ఫోర్క్ () ను 4 సార్లు ఉపయోగించే కింది సందర్భాన్ని పరిగణించండి:

కోడ్:

#చేర్చండి
#చేర్చండి
#చేర్చండి

intప్రధాన()
{
ఫోర్క్();
ఫోర్క్();
ఫోర్క్();
ఫోర్క్();
printf ('ఫోర్క్ () సిస్టమ్ కాల్ ఉపయోగించి');
తిరిగి 0;
}

అవుట్‌పుట్:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

ఇప్పుడు సృష్టించబడిన మొత్తం ప్రక్రియల సంఖ్య 24= 16 మరియు మా ముద్రణ ప్రకటన 16 సార్లు అమలు చేయబడింది.

ఉదాహరణ 2: ఫోర్క్ () విజయవంతమైతే పరీక్షించడం

కింది ఉదాహరణలో ఫోర్క్ () ద్వారా తిరిగి ఇవ్వబడిన విలువ (int) ని పరీక్షించడానికి మేము నిర్ణయాత్మక నిర్మాణాన్ని ఉపయోగించాము. మరియు సంబంధిత సందేశాలు ప్రదర్శించబడతాయి:

కోడ్:

#చేర్చండి
#చేర్చండి
#చేర్చండి

intప్రధాన()
{
pid_t p;
p=ఫోర్క్();
ఉంటే(p== -1)
{
printf ('ఫోర్క్ () కి కాల్ చేస్తున్నప్పుడు లోపం ఉంది');
}
ఉంటే(p==0)
{
printf ('మేము పిల్లల ప్రక్రియలో ఉన్నాము');
}
లేకపోతే
{
printf ('మేము మాతృ ప్రక్రియలో ఉన్నాము');
}
తిరిగి 0;
}

అవుట్‌పుట్:

మేము మాతృ ప్రక్రియలో ఉన్నాము
మేము పిల్లల ప్రక్రియలో ఉన్నాము

పై ఉదాహరణలో మేము ఫోర్క్ () యొక్క రిటర్న్ విలువను నిల్వ చేసే pid_t రకాన్ని ఉపయోగించాము. ఫోర్క్ () ను లైన్‌లో పిలుస్తారు:

p=ఫోర్క్();

కాబట్టి ఫోర్క్ () ద్వారా తిరిగి వచ్చిన పూర్ణాంక విలువ p లో నిల్వ చేయబడుతుంది మరియు తరువాత p మా ఫోర్క్ () కాల్ విజయవంతమైందో లేదో తనిఖీ చేయడానికి పోల్చబడుతుంది.

ఫోర్క్ () కాల్ ఉపయోగించినప్పుడు మరియు చైల్డ్ విజయవంతంగా సృష్టించబడినప్పుడు, చైల్డ్ ప్రాసెస్ ఐడి పేరెంట్ ప్రాసెస్‌కు మరియు 0 పిల్లల ప్రాసెస్‌కు తిరిగి వస్తుంది. పేరెంట్ ప్రాసెస్‌లో చైల్డ్ ప్రాసెస్ యొక్క ID ఒకేలా ఉండదు పిల్లల ప్రక్రియలోనే పిల్లల ప్రక్రియ యొక్క ID. పిల్లల ప్రక్రియలో పిల్లల ప్రక్రియ యొక్క ID 0 అవుతుంది.

ఈ ట్యుటోరియల్‌తో మీరు లైనక్స్‌లో ఫోర్క్ సిస్టమ్ కాల్‌తో ఎలా ప్రారంభించాలో చూడవచ్చు.