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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: mmb_hand در 27 آذر 1394، 04:28 ق‌ظ

عنوان: کمک فوری - fork()
ارسال شده توسط: mmb_hand در 27 آذر 1394، 04:28 ق‌ظ
با سلام
من یه برنامه به زبان c نوشتم و داخلش از fork استفاده کردم.
یه مشکلی دارم.
برنامه برای دفعه اول درست اجرا میشه ولی برای دفعات بعد خراب میشه.
فک کنم مشکل از اینجا باشه که ترتیب ‍پروسه های فرزند و پدر مشخص نیست.
این مشکل رو چطوری باید حل کنم؟
عنوان: پاسخ : کمک فوری - fork()
ارسال شده توسط: فاروق در 27 آذر 1394، 09:08 ق‌ظ
سوال بنظرم مبهمه.
حداقل کد برنامه رو بزار
عنوان: پاسخ : کمک فوری - fork()
ارسال شده توسط: ngc0der در 27 آذر 1394، 12:33 ب‌ظ
اینکه بگیم "برنامه خراب میشه" به نظرتون چطوری باید تفسیر بشه؟!
به هر صورت بعد از صدا زدن fork شما دو تا پروسس دارین و باید مثل این مثال http://www.thegeekstuff.com/2012/05/c-fork-function با استفاده از pidی که این تابع برمی گردونه بفمین در کدوم پروسس هستین: pid == 0 یعنی در پروسس فرزند، pid > 0 یعنی در پروسس parent و pid < 0 یعنی خطا در فورک.
عنوان: پاسخ : کمک فوری - fork()
ارسال شده توسط: mmb_hand در 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;
}
عنوان: پاسخ : کمک فوری - fork()
ارسال شده توسط: mmb_hand در 23 دی 1394، 08:02 ق‌ظ
یعنی کلا کسی نیست به سوال ما جواب بده؟
عنوان: پاسخ : کمک فوری - fork()
ارسال شده توسط: nixoeen در 23 دی 1394، 04:02 ب‌ظ
پیشنهاد من اینه ابتدا با برنامه‌های ساده‌تر بدون الگوریتم پیچیده‌ای شروع به کار با fork بکنید تا یاد بگیرید fork چطور کار می‌کنه، بعد سعی کنید با الگوریتم‌های دیگه ترکیبش بکنید.