ويندوز مقابل لينكس غك أرجف [c++]


Answers

أرجف

argv[0] هو معلمة مثل أي الآخرين: يمكن أن يكون نول إنهاء نيت التعسفي. يمكن أن تكون سلسلة فارغة. هذا هو ما تريد عملية الإطلاق.

افتراضيا، قذيفة مع مجموعة argv[0] إلى ما يستخدم لاسم البرنامج: اسم بدا في $PATH ، قريب أو مسار مطلق. يمكن أن يكون رابط رمزي أو ملف عادي.

لاستدعاء برنامج مع بعض القيمة الأخرى، مع زش (دونو مع قذائف أخرى) استخدام:

ARGV0=whatever_you_want some_program arguments

إذا كنت حقا بحاجة إلى المسار إلى القابل للتنفيذ، لا يمكنك استخدام سطر الأوامر على أونيكس.

لينوكس فقط

على لينكس: /proc/self/exe هو رابط رمزي للملف القابل للتنفيذ.

يمكنك readlink ذلك. يمكنك أيضا stat أو open مباشرة.

إعادة تسمية وصلة لينة

وصلة لينة طبيعية هي سلسلة غبية، ولا يعرف ما يحدث لهدفها (إذا كان موجودا على الإطلاق). ولكن /proc/self/exe لين لينك هو السحر.

في حالة إعادة تسمية، سوف لينة ولكن السحر الارتباط تتبع إعادة تسمية. في حالة وجود العديد من الروابط الصلبة، وسوف تتبع اسم الارتباط الثابت معين الذي تم استخدامه. (وصلات صلبة مختلفة جدا إلى نفس الملف ليست معادلة تماما تحت لينكس.)

إذا تم إلغاء ربط هذا الرابط الثابت، أعتقد أن " (deleted)" يتم إلحاقه بقيمة الارتباط الرمزي. لاحظ أن هذا هو اسم ملف صالح، لذلك ملف آخر غير ذات صلة يمكن أن يكون هذا الاسم.

في أي حال، الارتباط الرمزي هو رابط ثابت للملف ، حتى تتمكن من stat أو open مباشرة.

لا أعتقد أنك يمكن الاعتماد على أي شيء على نظام ملفات الشبكة إذا تم إعادة تسمية أو إلغاء ربط ثنائي على نظام آخر من واحد حيث يتم تشغيل القابل للتنفيذ.

اعتبارات أمنية

عندما يحصل البرنامج الخاص بك لاستخدام الملف الخاص /proc/self/exe ، فمن الممكن للملف المستخدم لإطلاق البرنامج الخاص بك ليكون unlink إد أو rename د. وينبغي أن يؤخذ هذا على محمل الجد في حالة البرنامج هو امتياز (سويد أو مجموعة القدرات): حتى لو لم يكن لدى المستخدم الوصول إلى الكتابة الأصلية "تعيين شيء" ثنائي، وقال انه قد تكون قادرة على جعل وصلة صلبة له إذا كان لديه حق الوصول للكتابة إلى دليل على نفس نظام الملفات، لذلك قد يكون قادرا على تغيير الاسم إذا كان تشغيل ثنائي متميز.

وبحلول الوقت الذي تقوم فيه readlink ، قد تشير القيمة التي تم إرجاعها إلى ملف آخر. (بطبيعة الحال، هناك دائما شرط سباق لا مفر منه مع open نتيجة ل readlink .)

كالمعتاد، نفس لا يوفر جميع الضمانات نفسها التي لديها أنظمة الملفات المحلية.

Question

تكرار محتمل:
الحصول على مسار قابل للتنفيذ

أنا برمجة على ويندوز باستخدام مينغو، غك 4.4.3. عندما أستخدم الوظيفة الرئيسية مثل هذا:

int main(int argc, char* argv[]){
    cout << "path is " << argv[0] << endl;
}

على ويندوز أحصل على مسار كامل مثل هذا: "C: / ديف / ستوف / بن / تيست". عند تشغيل نفس التطبيق على لينكس، ومع ذلك، أحصل على نوع من المسار النسبي: "بن / اختبار". انها كسر طلبي! أي فكرة عن كيفية التأكد من المسار المطلق على كلا النظامين؟