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