Χωρίς να 'μαι ο πιο ειδικός σε αυτη την περιοχή, αυτό που θες έχει να κάνει με δυο διαδικασίες που η μια θα γράφει μια διαταξη από ακεραίους σε μια περιοχή κοινής μνήμης, και η άλλη θα διαβάζει και θα κάνει τη δυαδική αναζήτηση. Με τη λέξη ποποι τι ακριβώς εννοείς ; Αυτό που γράφω φτιάχνει μια περιοχή κοινης μνήμης και βάζει 20 τιμές σε αυτή, οι οποίες έχουν ζητηθεί από το χρήστη. Μετά κάνει μέσα της μια δυαδική αναζήτηση με τη βοήθεια της qsort() & bsearch() (binarysearch συνάρτηση), και σου επιστρέφει τη θέση που βρίσκεται η τιμή που αναζητάς ή -1. Αυτή μάλλον θα πρέπει να μπει σαν θυγατρική διαδικασία. Ένας κώδικας που ίσως σε βοηθήσει είναι αυτός
- Κώδικας: Επιλογή όλων
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
int intcompare(const void* v1,const void* v2);
int binsearch(int n,int* arr,int keyval);
int main(){
int* array=0; /*the array has 20 values*/
int nval=20,i,keyval,keyid; /**/
int id_shmem=0;
key_t ipc_key;
ipc_key=5456;
id_shmem = shmget(ipc_key, sizeof(int)*nval, IPC_CREAT|0666);
printf("%d = id_shmem\n",id_shmem);
if (id_shmem<0){
perror("shmget error");
exit(1);
}
array = (int*)shmat(id_shmem,0,0);
if (array==(int*) -1){
perror("shmat error");
exit(1);
}
printf("Enter %d values\n",nval);
for (i=0;i<nval;i++)
scanf("%d",&array[i]);
printf("Enter value for binary search in array\n");
scanf("%d",&keyval);
keyid=binsearch(nval,array,keyval);
if (keyid==-1) printf("%d value not found\n",keyval);
else printf("%d value found at %d in sorted array\n",keyval,keyid);
return 0;
}
int intcompare(const void* v1,const void* v2){
return (*((int*)v1)-*((int*)v2));
}
int binsearch(int n,int* arr,int keyval){
int i;
int* parr=0;
qsort(arr,n,sizeof(int),intcompare);
printf("sorted array\n");
for (i=0;i<n;i++)
printf("%d\n",arr[i]);
parr=(int*)bsearch(&keyval,arr,n,sizeof(int),intcompare);
if (parr) return (parr-arr);
else return -1;
}
Αυτό βεβαίως δεν υλοποιεί τη θυγατρική διαδικασία, και η binarysearch πρέπει να υλοποιηθεί στη θυγατρική. Δηλαδή κάποιες αλλαγές θα πρέπει να κάνεις και να βάλεις μια wait function. Επίσης ίσως χρειαστείς να δεσμεύσεις +1 int θέση για την επιστρεφόμενη τιμή. Δεν ξέρω αν βοήθησαν αυτά που αναφέρω.