لماذا يتم إنتاج SYSCTL E_INVAL على MAC OS X؟
-
24-09-2019 - |
سؤال
فيما يلي عبارة عن مقتطف من رمز 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
صفحة الرجل.