במאמר זה, אני הולך לדבר על משפחת הפונקציות 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 לתכנות מערכת בלינוקס. תודה שקראת מאמר זה.