انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: کمک فوری - fork()  (دفعات بازدید: 1911 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین mmb_hand

  • Jr. Member
  • *
  • ارسال: 63
کمک فوری - fork()
« : 27 آذر 1394، 04:28 ق‌ظ »
با سلام
من یه برنامه به زبان c نوشتم و داخلش از fork استفاده کردم.
یه مشکلی دارم.
برنامه برای دفعه اول درست اجرا میشه ولی برای دفعات بعد خراب میشه.
فک کنم مشکل از اینجا باشه که ترتیب ‍پروسه های فرزند و پدر مشخص نیست.
این مشکل رو چطوری باید حل کنم؟

آفلاین فاروق

  • Hero Member
  • *
  • ارسال: 992
  • جنسیت : پسر
  • <شعار>این یک شعار است</شعار>
    • تارنمای فاروق
پاسخ : کمک فوری - fork()
« پاسخ #1 : 27 آذر 1394، 09:08 ق‌ظ »
سوال بنظرم مبهمه.
حداقل کد برنامه رو بزار
http://pcworms.blog.ir
بعد از بررسی پست های قدیمیم، فکر میکنم یک عذرخواهی بدهکارم! معذرت میخوام و اگر اشتباه کردم مستقیم و روشن راهنمایی کنید تا تکرار نکنم.
کانال IRC

آفلاین ngc0der

  • Full Member
  • *
  • ارسال: 106
پاسخ : کمک فوری - fork()
« پاسخ #2 : 27 آذر 1394، 12:33 ب‌ظ »
اینکه بگیم "برنامه خراب میشه" به نظرتون چطوری باید تفسیر بشه؟!
به هر صورت بعد از صدا زدن fork شما دو تا پروسس دارین و باید مثل این مثال http://www.thegeekstuff.com/2012/05/c-fork-function با استفاده از pidی که این تابع برمی گردونه بفمین در کدوم پروسس هستین: pid == 0 یعنی در پروسس فرزند، pid > 0 یعنی در پروسس parent و pid < 0 یعنی خطا در فورک.

آفلاین mmb_hand

  • Jr. Member
  • *
  • ارسال: 63
پاسخ : کمک فوری - fork()
« پاسخ #3 : 29 آذر 1394، 09:17 ق‌ظ »
سوال بنظرم مبهمه.
حداقل کد برنامه رو بزار

برنامه کد quick sort با استفاده از fork هست و کدش رو هم در زیر قرار دادم.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>



//function
void input(int A[], int n)
{
int i, num;
for(i=1 ; i<=n ; i++)
{
printf("enter number%d : ", i);
scanf("%d", &num);
A[i] = num;
}
}

void out(int A[], int n)
{
int i;
printf("--------- sorted is --------- \n");
for(i=1 ; i<=n ; i++)
{
printf("%d\t", A[i]);
}
printf("\n");
}

int partition( int A[], int p, int q)
{
int temp;
int x = A[p];
int i = p;
for (int j = p+1; j <= q; j++)
{
if (A[j] <= x)
{
i++;
temp = A[j];
A[j] = A[i];
A[i] = temp;
}
}
temp = A[i];
A[i] = A[p];
A[p] = temp;
return i;
}
//
 
//quick sort
void Quick_sort( int A[], int p,int r)
{
int q;
int leftchild = -1;
int rightchild = -1;

if( p<r)
{
int status;

q = partition(A,p,r);

leftchild = fork();
if (leftchild < 0)
{
perror("fork");
exit(1);
}
if (leftchild == 0)
{
Quick_sort( A, p, q-1);
exit(0);
} else
{
rightchild = fork();
if (rightchild < 0)
{
perror("fork");
exit(1);
}
if (rightchild == 0)
{
Quick_sort( A, q+1, r);
exit(0);
}
}
waitpid(leftchild, &status, 0);
waitpid(rightchild, &status, 0);
}
}

 
int main()
{
//one example
int n;
int A[20] = {0};


  printf("how many number you get to sort?");
scanf("%d", &n);

input(A, n);

Quick_sort(A, 1, n);
 
out(A, n);
 
return 0;
}

آفلاین mmb_hand

  • Jr. Member
  • *
  • ارسال: 63
پاسخ : کمک فوری - fork()
« پاسخ #4 : 23 دی 1394، 08:02 ق‌ظ »
یعنی کلا کسی نیست به سوال ما جواب بده؟

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4871
  • جنسیت : پسر
  • masoft قدیم
پاسخ : کمک فوری - fork()
« پاسخ #5 : 23 دی 1394، 04:02 ب‌ظ »
پیشنهاد من اینه ابتدا با برنامه‌های ساده‌تر بدون الگوریتم پیچیده‌ای شروع به کار با fork بکنید تا یاد بگیرید fork چطور کار می‌کنه، بعد سعی کنید با الگوریتم‌های دیگه ترکیبش بکنید.