PDA

View Full Version : چطور میتونم ID یه پروسه رو بدست بیارم؟



C
شنبه 26 دی 1383, 20:30 عصر
با عرض سلام خسته نباشید
با اجازهء اساتید میخواستم یه سئوال بپرسم دربارهء نحوهء کنترل پروسه ها با استفاده از C.شما وقتی توی ویندوز فرمان tasklist یا Taskmgr.exe رو اجرا میکنید لیستی از پروسه ها رو نشون میده که همشون یه Image name،Process ID و ... دارن.
سئوال اول:
در C چطوری میشه با داشتن Image name یک پروسه که مثلاً cmd.exe هست Process ID اون رو بدست آورد؟
سئوال دوم:
چطور میشه به کار یک پروسه با استفاده از C پایان داد؟ بعضی اوقات وقتی یه پروسه رو میبندید دوباره خود به خود اجرا میشه.

و در آخر یه توضیح کوچیک دربارهء Child Process و Parent Process.

هر چی سرچ کردن تقریباً تمام مطالب مربوط به Unix/Linux/*BSD بود.اگه زحمتی نیست یه تابع معرفی کنید یا حداقل اگه اطلاعاتی در این زمینه دارید بنویسید ممنون میشم. :flower:

Inprise
یک شنبه 27 دی 1383, 10:45 صبح
چطوری میشه با داشتن Image name یک پروسه که مثلاً cmd.exe هست Process ID اون رو بدست آورد؟

برای دریافت اطلاعات مربوط به پروسه ها ، حرکت بین پروسه ها و انتخاب اونها برای کسب اطلاعات یا گرفتن هندل برای انجام سایر وظایف و ... دو روش کلی وجود داره . اول : استفاده از PSAPI که فقط روی ویندوزهای مبتنی بر NT وجود داره ؛ دوم : استفاده از ToolHelp Functions که متعقله به Kernel32 و روی تمامی نسخ ویندوز موجوده . همین اطلاعات برای اینکه بقیه راه رو به کمک MSDN بری کافیه ؛ اما به عنوان توضیح اضافی :

اگر بخوای از ToolHelp Functions استفاده کنی توابع و ساختارهای متعددی هستن که بهت کمک میکنن .

CreateToolhelp32SnapShot
Process32First
Process32Next
struct tagPROCESSENTRY32

و اگر PSAPI مورد نظرت باشه .

EnumProcesses
GetModuleFileNameEx

که احتمالا" خودت از پس ترکیب اونها و حل مشکلت بر خواهی اومد . اگر تلاش کردی و نشد بگو .



چطور میشه به کار یک پروسه با استفاده از C پایان داد؟

تابع TerminateProcess با داشتن هندل یک پروسه اون رو میبنده .



بعضی اوقات وقتی یه پروسه رو میبندید دوباره خود به خود اجرا میشه

لابد پروسهء دیگری داره از این پروسه مراقبت میکنه و به محض بسته شدن مجددا" اجراش میکنه . اغلب فایروالها و آنتی ویروسها به این ویژگی مجهز هستند .



یه توضیح کوچیک دربارهء Child Process و Parent Process.

وقتی یک پروسه تابع CreateProcess رو فراخوانی میکنه ، یک پروسهء Child ایجاد میشه که از دید ِ اون ، پروسهء فراخوانی کنندهء CreateProcess ، پروسهء Parent است . در ویندوز بر خلاف یونیکس ، ویژگیهای پروسهء پدر بصورت پیش فرض به فرزندان منتقل نمیشه .



هر چی سرچ کردن تقریباً تمام مطالب مربوط به Unix/Linux/*BSD بود

MSDN به ویندوز اختصاص داره و آنچه بنده در جوابت عرض کردم بطور کاملتر ، مفصلتر ، همراه با مثال و کد اونجا هست . آب رو باید از چشمه خورد عزیز برادر !

موفق باشی :)

C
یک شنبه 27 دی 1383, 20:08 عصر
خیلی ممنونم از راهنماییتون
یه دنیا ممنون.
تست میکنم اگه مشکل داشتم بازم مزاحمتون میشم.
:flower:

Inprise
دوشنبه 28 دی 1383, 00:17 صبح
:)

C
چهارشنبه 30 دی 1383, 12:37 عصر
خوب،چند روزی مشغول امتحانات بودم وقت نکردم گفته های شما رو زودتر انجام بدم.
«» توابعی که فرمودید روی کامپایلر من کار نمیکنه.اگه ممکنه یه کامپایلر هم معرفی کنید که دانلود کنم.تا به حال بهترین کامپایلری که توی شهرمون پیدا کردم ++Borland C بوده که باهاش برنامه های C رو بدون مشکل کامپایل میکردم! گاهی هم با GCC در لینوکس.

با تشکر قبلی :oops:

Inprise
چهارشنبه 30 دی 1383, 13:33 عصر
برای نوشتن یک برنامهء Win32 قاعدتا" به Windows SDK و یک کامپایلر سی احتیاج داری . اگر از Visual C یا Borland C builder استفاده کنی ، SDK و کامپایلر مشترکا" موجودند . اگر از سایر کامپایلرها استفاده میکنی باید SDK رو دریافت و نصب کنی . توصیه میکنم برای ویندوز از چیزی بجز VC یا BCB استفاده نکنی که آخرین نسخ هر کدوم به وفور تو بازار موجودند .