שיחת מערכת Exec ב- C

Exec System Call C



למשפחת ה- exec פונקציות רבות ב- C. פונקציות C אלה משמשות בעצם להפעלת פקודת מערכת בתהליך נפרד שהתוכנית הראשית תדפיס את הפלט.

במאמר זה, אני הולך לדבר על משפחת הפונקציות exec ומראה לך כיצד להשתמש בכל אחת מהפונקציות המשפחתיות של Exec ב- C. אז בואו נתחיל.







פונקציות מערכת C במשפחת Exec:

משפחות הפונקציות exec מוגדרות בכותרת unistd.h . לכן, עליך להשתמש בכותרת זו בתוכנית C שבה ברצונך להשתמש בפונקציות אלה.



להלן פונקציות ה- exec הזמינות יחד עם פרמטרי הפונקציה שלהן:



  • int execl (const char *path, const char *arg,…, NULL);
  • int execlp (const char *file, const char *arg,…, NULL);
  • int execv (const char *path, char *const argv []);
  • int execvp (const char *file, char *const argv []);
  • int execle (const char *path, const char *arg,…, NULL, char *const envp []);
  • int execve (const char *file, char *const argv [], char *const envp []);

בואו נראה מה כל אחת מהפונקציות הללו עושה וכיצד להשתמש בהן.





execl () פונקציית המערכת:

בפונקציית המערכת execl () לוקח את הנתיב של הקובץ הבינארי ההפעלה (כלומר / bin / ls ) כטיעון הראשון והשני. לאחר מכן, הטיעונים (כלומר -אה , /בית ) שברצונך להעביר למנהל ההפעלה ואחריו ריק . לאחר מכן פונקציית המערכת execl () מריצה את הפקודה ומדפיסה את הפלט. אם מתרחשת שגיאה כלשהי, execl () מחזיר -1. אחרת זה לא מחזיר כלום.

תחביר:

intexecl(קבוע לְהַשְׁחִיר *נָתִיב, קבוע לְהַשְׁחִיר *כּוֹעֵס,...,ריק);

להלן דוגמה לפונקציית המערכת execl ():



#לִכלוֹל

intרָאשִׁי(בָּטֵל) {
לְהַשְׁחִיר *binaryPath= ' / bin / ls';
לְהַשְׁחִיר *arg1= '-אה';
לְהַשְׁחִיר *arg2= '/בית';

execl(binaryPath,binaryPath,arg1,arg2,ריק);

לַחֲזוֹר 0;
}

ניהלתי את ls -lh / home פקודה באמצעות פונקציית המערכת execl (). כפי שאתה יכול לראות, התוצאה הנכונה מוצגת.

execlp () פונקציית המערכת:

execl () אינו משתמש ב- נָתִיב משתנה הסביבה. לכן, הנתיב המלא של קובץ ההפעלה נדרש להפעלת אותו עם execl (). execlp () משתמש במשתנה הסביבה PATH. לכן, אם קובץ הפעלה או פקודה זמינים ב- PATH, אז הפקודה או שם הקובץ מספיקים כדי להריץ אותו, אין צורך בנתיב המלא.

תחביר:

intexeclp(קבוע לְהַשְׁחִיר *קוֹבֶץ, קבוע לְהַשְׁחִיר *כּוֹעֵס,...,ריק);

אנו יכולים לשכתב את הדוגמה execl () באמצעות פונקציית המערכת execlp () כדלקמן:

#לִכלוֹל

intרָאשִׁי(בָּטֵל) {
לְהַשְׁחִיר *programName= 'ls';
לְהַשְׁחִיר *arg1= '-אה';
לְהַשְׁחִיר *arg2= '/בית';

execlp(programName,programName,arg1,arg2,ריק);

לַחֲזוֹר 0;
}

העברתי רק את שם הפקודה ls , לא הדרך המלאה / bin / ls . כפי שאתה יכול לראות, קיבלתי את אותו הפלט כמו קודם.

execv () פונקציית המערכת:

בפונקציה execl (), הפרמטרים של קובץ ההפעלה מועברים לפונקציה כארגומנטים שונים. עם execv (), תוכל להעביר את כל הפרמטרים במערך שהסתיים ב- NULL argv . המרכיב הראשון של המערך צריך להיות הנתיב של קובץ ההפעלה. אחרת, הפונקציה execv () פועלת בדיוק כמו פונקציית execl ().

תחביר:

intexecv(קבוע לְהַשְׁחִיר *נָתִיב, לְהַשְׁחִיר *קבועargv[]);

אנו יכולים לשכתב את הדוגמה execl () כדלקמן:

#לִכלוֹל

intרָאשִׁי(בָּטֵל) {
לְהַשְׁחִיר *binaryPath= ' / bin / ls';
לְהַשְׁחִיר *טוען[] = {binaryPath, '-אה', '/בית',ריק};

execv(binaryPath,טוען);

לַחֲזוֹר 0;
}

כפי שאתה יכול לראות, אני מקבל את הפלט הנכון.

execvp () פונקציית המערכת:

פועל באותו אופן כמו פונקציית המערכת execv (). אבל, משתמשים במשתנה הסביבה PATH. לכן, הנתיב המלא של קובץ ההפעלה אינו נדרש בדיוק כמו ב- execlp ().

תחביר:

intexecvp(קבוע לְהַשְׁחִיר *קוֹבֶץ, לְהַשְׁחִיר *קבועargv[]);

אנו יכולים לשכתב את הדוגמה execv () כדלקמן:

#לִכלוֹל

intרָאשִׁי(בָּטֵל) {
לְהַשְׁחִיר *programName= 'ls';
לְהַשְׁחִיר *טוען[] = {programName, '-אה', '/בית',ריק};

execvp(programName,טוען);

לַחֲזוֹר 0;
}

כפי שאתה יכול לראות, הפלט הנכון מוצג.

execle () פונקציית המערכת:

עובד בדיוק כמו execl () אבל אתה יכול לספק משתני סביבה משלך יחד עם זה. משתני הסביבה מועברים כמערך envp . המרכיב האחרון של envp המערך צריך להיות NULL. כל האלמנטים האחרים מכילים את זוגות הערך-מפתח כמחרוזת.

תחביר:

intלהורג(קבוע לְהַשְׁחִיר *נָתִיב, קבוע לְהַשְׁחִיר *כּוֹעֵס,...,ריק, לְהַשְׁחִיר * קבועenvp[] );

להלן דוגמה לפונקציית המערכת execle ():

#לִכלוֹל

intרָאשִׁי(בָּטֵל) {
לְהַשְׁחִיר *binaryPath= '/bin/bash';
לְהַשְׁחִיר *arg1= '-c';
לְהַשְׁחִיר *arg2= 'זרק 'בקר ב $ HOSTNAME:$ PORT מהדפדפן שלך.'';
לְהַשְׁחִיר *קבועenv[] = {'HOSTNAME = www.linuxhint.com', 'נמל = 8080',ריק};

להורג(binaryPath,binaryPath,arg1,arg2,ריק,env);

לַחֲזוֹר 0;
}

עברתי שני משתני סביבה שם מארח ו נמל לפונקציית execle (). כפי שאתה יכול לראות, אני יכול לגשת אליהם מההפעלה /bin/bash .

execve () פונקציית המערכת:

בדיוק כמו execle () אתה יכול לספק משתני סביבה משלך יחד עם execve (). תוכל גם להעביר ארגומנטים כמערכים כפי שעשית ב- execv ().

תחביר:

intלהוציא להורג(קבוע לְהַשְׁחִיר *קוֹבֶץ, לְהַשְׁחִיר *קבועargv[], לְהַשְׁחִיר *קבועenvp[]);

ניתן לשכתב את הדוגמה של execle () כדלקמן:

#לִכלוֹל

intרָאשִׁי(בָּטֵל) {
לְהַשְׁחִיר *binaryPath= '/bin/bash';
לְהַשְׁחִיר *קבועטוען[] = {binaryPath, '-c', 'זרק 'בקר ב $ HOSTNAME:$ נמל
מהדפדפן שלך.'',ריק};
לְהַשְׁחִיר *קבועenv[] = {'HOSTNAME = www.linuxhint.com', 'נמל = 8080',ריק};

להוציא להורג(binaryPath,טוען,env);

לַחֲזוֹר 0;
}

כפי שאתה יכול לראות, אנו מקבלים את אותו פלט כמו בדוגמה execle ().

אז ככה אתה משתמש במשפחת הפונקציות exec ב- C לתכנות מערכת בלינוקס. תודה שקראת מאמר זה.