سؤال

انا استخدم 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 {} \;

أوتش!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top