لغة Go بالأمثلة: استبدال العملية (exec)

تعرفنا في المثال السابق على تشغيل عمليات خارجية. نفعل ذلك عندما نحتاج إلى عملية خارجية تستطيع عملية Go قيد التشغيل الوصول إليها. نريد أحيانًا استبدال عملية Go الحالية بالكامل بعملية أخرى، قد لا تكون مكتوبة بلغة Go. لفعل ذلك، سنستخدم تنفيذ Go لدالة exec التقليدية.

package main
import (
    "os"
    "os/exec"
    "syscall"
)
func main() {

سنستبدل عمليتنا في هذا المثال بـls. تتطلب Go مسارًا مطلقًا للملف التنفيذي الذي نريد تشغيله، لذا سنستخدم exec.LookPath للعثور عليه، ويُرجح أن يكون /bin/ls.

    binary, lookErr := exec.LookPath("ls")
    if lookErr != nil {
        panic(lookErr)
    }

تتطلب Exec الوسائط في صورة شريحة، لا سلسلة نصية كبيرة واحدة. سنمرر إلى ls بعض الوسائط الشائعة. لاحظ أن الوسيط الأول ينبغي أن يكون اسم البرنامج.

    args := []string{"ls", "-a", "-l", "-h"}

تحتاج Exec أيضًا إلى مجموعة من متغيرات البيئة لاستخدامها. نوفر هنا بيئتنا الحالية فحسب.

    env := os.Environ()

هذا هو استدعاء syscall.Exec الفعلي. إذا نجح الاستدعاء، فسينتهي تنفيذ عمليتنا هنا وتحل محله العملية /bin/ls -a -l -h. وإذا حدث خطأ، فسنحصل على قيمة إرجاع.

    execErr := syscall.Exec(binary, args, env)
    if execErr != nil {
        panic(execErr)
    }
}

عند تشغيل برنامجنا، يحل محله الأمر ls.

$ go run execing-processes.go
total 16
drwxr-xr-x  4 mark 136B Oct 3 16:29 .
drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
-rw-r--r--  1 mark 1.3K Oct 3 16:28 execing-processes.go

لاحظ أن Go لا توفر دالة fork التقليدية في Unix. لا يمثل ذلك مشكلة عادة، لأن بدء روتينات Go وتشغيل العمليات واستبدالها يغطي معظم حالات استخدام fork.

المثال التالي: .