تحويل STD :: المتجهات إلى حجة نمط C ناقل ARV
سؤال
أود أن أعد ناقلات حجة قديمة للمدرسة (Argv) لاستخدامها داخل الوظيفة
Int Execove (const char * اسم الملف، char * const argv []، char * const envp [])؛
جربته مع فئة STL :: Vector:
std::string arguments = std::string("arg1");
std::vector<char*> argv;
char argument[128];
strcpy(argument, arguments.c_str());
argv.push_back(argument);
argv.push_back('\0'); // finish argv with zero
وأخيرا اجتاز المتجه إلى Execove ()
Execove ("bashscriptxy"، & argv [0]، null)
كود الكود، ولكن يحصل "تجاهل Argv" بواسطة Execove (). لذلك يبدو أن الخطأ، ما أحاول. كيف يمكنني بناء Argv بطريقة فعالة مع C ++؟
المحلول
أعتقد أن السحر [128] أمر زائد مثل السلسلة المحلية سيكون لها نفس العمر، وأيضا، حاول إضافة برنامج Argv [0] مثل روسوفت في إجابته:
const std::string arguments("arg1");
std::vector<const char*> argv;
argv.push_back("bashscriptXY");
// The string will live as long as a locally allocated char*
argv.push_back(arguments.c_str());
argv.push_back(NULL); // finish argv with zero
execve(argv[0], &argv[0], NULL);
نصائح أخرى
احذر ذلك argv[0]
هو دائما اسم الأمر نفسه. لذلك إذا كنت ترغب في تمرير معلمة واحدة إلى برنامج، يجب عليك ملء عنصرين:
argv[0]
يجب ان يكون "bashscriptXY
"(أو كل ما تريد ...)
argv[1] = "your_argument"
بعض القضايا:
- العنصر الأول من
argv
من المفترض أن يكون نصي اسم البرنامج ال(انظر التعليقات)argv
ناقل يمكن أن تأخذchar const*
أنواع as.execve()
لا تعدل Args (على الرغم من أن العملية التي يتم الاحتجاج بها قد - ولكن تلك ستكون نسخ في مساحة العنوان الخاصة بها). حتى تتمكن من الدفعc_str()
سلاسل على ذلك.
جرب هذا
// unfortunately, execve() wants an array of `char*`, not
// am array of `char const*`.
// So we we need to make sure the string data is
// actually null terminated
inline
std::string& null_terminate( std::string& s)
{
s.append( 1, 0);
return s;
}
// ...
std::string program = std::string( "bashscriptXY");
std::string arg1("arg1");
std::string arg2("arg2");
null_terminate(program);
null_terminate(arg1);
null_terminate(arg2);
std::vector<char *> argv;
argv.push_back( &program[0]);
argv.push_back( &arg1[0]);
argv.push_back( &arg2[0]);
argv.push_back( NULL); // finish argv with zero
intptr_t result = execve( program.c_str(), &argv[0], NULL);
ما لم تكن الحجج مشفرة بجد، سيتعين عليك القيام ببعض تخصيص الذاكرة الديناميكي. أولا، قم بإنشاء مجموعة من مؤشرات الأحرف لعدد الوسائط، ثم تخصيص الذاكرة لكل وسيطة ونسخ البيانات فيها.
هذا السؤال مشابهة جدا ويتضمن بعض حلول الكود.