PDA

View Full Version : کتابخانه سیگنال signal.h



NIMA_1981
پنج شنبه 07 اردیبهشت 1391, 10:30 صبح
سلام دوستان میشه بگید کار این کتابخانه جی هست و چه استفاده ای میشه از این کرد
با تشکر

one hacker alone
پنج شنبه 07 اردیبهشت 1391, 19:06 عصر
سلام دوست عزيز اين فايل سرآيند همون طور كه از اسمش معلومه كارش در رابطه با سگنال ها در برنامه هست
بحث سيگنال بحث جالبي هست كه متاسفانه به دليل روي آوردن به برنامه نويسي با زبان هاي سطح بالا كمتر كسي با اون اشنايي داره
شايد اگه بخوايم سيگنال رو براي برنامه نويس هاي زبان هاي سطح بالا توضيح بديم تنها چيزي كه بطونيم براشون توضيح بديم تا متوجه بشن قضيه چي هست همون Event ها باشن
هر انتفاقي كه در برنامه ميفته از وقفه در برنامه تا خطاهاي برگشت ناپذير يك برنامه مانند رخداد ها همگي با سيگنال ها به برنامه مشخص و اتفاق مي افتن اين سيگنال هست كه به برنامه ميگه در دنياي بيرون چه خبره و براي ما كار واسط رو انجام ميده يعني در واقع سيگنال هاي در هر برنامه خبرچين اون برنامه هستن كه همه چيزو بهمون گزارش ميدن
كتابخانه كه شما معرفي كردين شامل 2 تابع و تعدادي ماكرو هست
تابع Signal():
اين تابع وضعيت سيگنال رو با پارامتر SIG بررسي ميكنه

تابع raise()
اين تابع هم سيگنالي توليد كرده و به برنامه مورد نظر ميفرسته

بيشتر در برنامه نويسي سيستم استفاده ميشه البته به منظور ارتباط با دستگاه هاي خارجي مثلا براي ارتباط به ولتاژهاي توليد شده توسط دستگاهي كه داره ضربان قلب رو ميگيره

pe32_64
پنج شنبه 07 اردیبهشت 1391, 22:20 عصر
signal روش ارتباط برنامه با سیستم عامل(خطاو...)در سیستم عاملهای UNIX BASED مانند LINUX است.
همانند Exception در ویندوز.

NIMA_1981
جمعه 08 اردیبهشت 1391, 01:39 صبح
من از راهنمایی شما - من یک توضیحی در مورد کار خودم بگم که بهتر بتونید بنده را راهنمایی کنید - من یک برنامه در سیتم عامل لینوکس نوشتم که یک برنامه سرور بود که تعداد زیادی کلاینت میتونه توست ادرس شبکه و یک ‍‍‍‍‍÷ورت به او وصل بشن برنامه بصورت درست کار میکنه و هیچ مشکی نداره البته من توی این برنامه از FORK نیز استفاده کردم که برنامه بتونه هر تعداد کلاینت که درخواست داد رو مدریست کنه و وصل بشه - برنامه تا این قسمت بدون مشکل کار میکنه - اما به ÷یشنهاد یکی از دوستان گفنت که من باید این جند خط کد را به برنامه اضافه کنم که اگه تعداد کلایتت ها بیشتر شد برنامه با خطا مواجه نشه

void handleSig(int signum)
{
while(waitpid(-1, NULL, WNOHANG) > 0);
}



و ایم کد هم در تابع اصلی قرار میدم
[
signal(SIGCHLD, handleSig);


حالا من میهوام اینو بدنم چه خطایی ممکنه رخ بده و این کد چه کمکی میتونه بکنه
با تشکر

pe32_64
جمعه 08 اردیبهشت 1391, 01:59 صبح
خوندن نوشته ی شما ذهن منو برد سمت آموزش برنامه نویسی شبکه توسط Beej (http://beej.us/guide/bgnet/)!!!!!
من خودمم برنامه نویسی شبکه رو از این بابا یاد گرفتم.
جواب سوال شما رو هم جناب Beej (http://beej.us/guide/bgnet/) داده.
ولی بذارید منم یه چیزایی بگم:
تو سیستم عامل لینوکس وقتی شما برنامه ی دیگری رو اجرا میکنی، باید وقتی که اون برنامه ایجادشده(فرزند) بسته شد، شما اونو پاک سازی کنی -سیستم این کارو نمی کنه(ویندوز این طوری نیست)وگرنه اون فرزند تو حافظه می مونه و میگن زامبی شده و کداتون هم همین کارو میکنه و این ربطی به server یا client بودن برنامتون نداره.
بهتره از این کتاب Beej (http://beej.us/guide/bgnet/) هم استفاده کنید.
موفق باشید.
(توضیح بیشتر خواستین ، بگین)

haniyeh.ghassami
چهارشنبه 18 آذر 1394, 09:52 صبح
سلام
منم از همین منبع دارم استفاده میکنم
ممنون میشم من را راهنمایی کنید.
من نمیدونم دقیقا کد fork چه میکنه؟

if (!fork())
{ // this is the child process
close(sockfd);
// child doesn't need the listener
int a=send(new_fd, "Hello, world!", 13, 0);
if (a == -1)
perror("send");
close(new_fd);
exit(0);
}

کسی میتونه این تکه کد را برام توضیح بده
در زمان تریس کد از if میپره اما دستور ارسال انجام میشه
من نمیفههم چرا اینجوری میشه؟
و این کد :

sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1)
{
perror("sigaction");
exit(1);
}