تنفيذ أمر من C ++ ، ما هو المتوقع في Argv [0]؟
-
23-09-2019 - |
سؤال
انا استخدم execv()
لتشغيل الأوامر من / bin / مثل "ls" ، "PWD" ، "Echo" من برنامج C ++ الخاص بي ، وأنا أتساءل عن القيمة التي يجب أن أقدمها في Argv [0] ؛
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
المحلول
argv[0]
من المفترض أن يكون اسم البرنامج. تم نقله إلى البرنامج main
وظيفة. تميز بعض البرامج سلوكها اعتمادًا على السلسلة argv[0]
هو. على سبيل المثال GNU bash
ستعطيل شل بعض ميزاتها إذا تم الاتصال بها sh
بدلاً من bash
. من الأفضل إعطائها نفس القيمة التي تنقلها path
.
في لينكس ، argv[0]
هو اسم العملية معروضة من قبل top
فائدة (والتي ربما تحصل عليها من قراءة الإدخالات في /proc/
)
نصائح أخرى
يجب أن يكون Argv [0] هو المسار الكامل للأمر الذي تريد تشغيله.
أعلم أن هذا ليس هو الإجابة التي تبحث عنها ، لكن هل هناك سبب محدد لقيامك بذلك؟ السبب الذي أسأله هو أن معظم الإجراءات إن لم يكن جميعها تديرها الناس عادة system()
أو execv()
متوفرة في المكتبات على Windows أو Unix وهي أكثر أمانًا وأسرع وأقل عرضة للمعاناة ظرفي الأخطاء. أعني بذلك ، على سبيل المثال ، عندما PATH
التغييرات وفجأة تتوقف الكود الخاص بك عن العمل.
إذا كنت تمر في سلسلة ، إما كليًا أو جزئيًا ، وتشغيلها ، فأنت تترك نفسك أيضًا مفتوحًا للمستخدم للوصول إلى النظام عن طريق إدخال أمر قد يكون ضارًا. على سبيل المثال ، تخيل أنك قمت بتطبيق ملف بحث باستخدام find /home -name
وينوع المستخدمون في:
"%" -exec rm {} \;
أوتش!