سؤال

فيما يلي عبارة عن مقتطف من رمز C/OBJ-C الذي يستخدم SYSCTL للحصول على عملية معينة مع PID 50.

...
int getProcessArgs[3] = { CTL_KERN, KERN_PROCARGS, 50 };
sysctl(getProcessArgs, 3, NULL, &length, NULL, 0);
char* processArgs = malloc(length * sizeof(char));
sysctl(getProcessArgs, 3, processArgs, &length, NULL, 0);
...

تنجح الدعوة الأولى لـ SYSCTL (لتحديد حجم صفيف سلسلة ARGV). الطول الذي تم إرجاعه هو ~ 1600 ، أكبر مما كنت أتوقع ، لكنني لا أفترض أنه غير معقول. Malloc ينجح. يعود المكالمة الثانية إلى SYSCTL -1 ، حيث قم بإعداد ERRNO إلى 22 ، E_INVAL.

لقد نظرت إلى رمز آخر ، بما في ذلك ذلك من هذا السؤال, ، لكن لا يمكنني رؤية المشكلة مع لي. ماذا ينقصني؟

هل كانت مفيدة؟

المحلول

لقد حاولت لف الرمز الخاص بك في برنامج ، ويعمل بشكل جيد ويطبع Argv العملية الأخرى وما إلى ذلك عند الاستفسار عن إحدى العمليات الخاصة بي, ، أي واحدة مع نفس uid مثل العملية التي تستدعي sysctl().

الجانب "الأكبر مما أتوقعه" هو أن متغيرات بيئة العملية يتم إرجاعها وكذلك وسيطات سطر الأوامر. (ليس من الواضح ما هو شكل كل هذه المعلومات.)

عند الاستفسار عن أ مختلف عملية المستخدم ، أحصل على نفس einval من الثانية sysctl التي كنت ترىها. أعتقد أن هذا يعتبر فضولًا غير معقول بشأن عمليات الآخرين ، لكنك تعتقد أن الأول sysctl سيفشل أيضًا.

(عند الاستفسار عن PID غير موجود ، الأول sysctl يفشل مع Einval.)

يبدو أن كل هذا غير موثق بشكل كبير: على الفهد ، KERN_PROCARGS لا يظهر حتى في sysctl صفحة الرجل.

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