سؤال

أود أن أعد ناقلات حجة قديمة للمدرسة (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);

ما لم تكن الحجج مشفرة بجد، سيتعين عليك القيام ببعض تخصيص الذاكرة الديناميكي. أولا، قم بإنشاء مجموعة من مؤشرات الأحرف لعدد الوسائط، ثم تخصيص الذاكرة لكل وسيطة ونسخ البيانات فيها.

هذا السؤال مشابهة جدا ويتضمن بعض حلول الكود.

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