我想使用共享記憶體,fork()但似乎無法得到我想要的結果。
所以我有一個汽車結構陣列,我想把它放在共享記憶體中以便使用fork(). 然后我想運行 10fork()并等到所有孩子都完成后顯示結果!(結果只是他們每輛車的總時間,它是不同的,因為我為每輛車生成一個亂數)。
問題是當我printf()對每個人都有相同的價值時,而對每個孩子來說卻必須不同!因為我只用一個回圈進行了測驗,所以沒有共享記憶體它可以正常作業,但我必須使用共享記憶體;)。
有人可以幫我嗎
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <sys/wait.h>
#define NUMBER_OF_CARS 10
#define MIN 25000 // time generator
#define MAX 40000
typedef struct {
unsigned int totalTime;
} car;
car *shared_memory;
int drive(int i);
unsigned int generateNumber(void);
void display();
int main(void)
{
srand( time(NULL) );
/***************************************************
* Creating shared memory *
****************************************************/
int segment_id = shmget(IPC_PRIVATE, sizeof(car) * NUMBER_OF_CARS, 0666 | IPC_CREAT);
if (segment_id == -1) {
perror("shmget() failed !");
exit(EXIT_FAILURE);
}
shared_memory = shmat(segment_id, NULL, 0);
if (shared_memory == (void *) (-1)) {
perror("shmat() failed !");
exit(EXIT_FAILURE);
}
/**********************************************************
* Creation of child / cars *
**********************************************************/
int i;
pid_t pid = 0;
for (i = 0; i < NUMBER_OF_CARS; i ) {
pid = fork();
if (pid == 0)
break;
}
switch (pid) {
case -1:
perror("fork failed !");
exit(EXIT_FAILURE);
case 0:
drive(i); //540000
exit(EXIT_SUCCESS);
default:
display();
/******** wait for children to finish *********/
for (int j = 0; j < NUMBER_OF_CARS; j ) {
wait(NULL);
}
}
/******** Detach memory segments *********/
shmdt(shared_memory);
/******** Delete shared memory *********/
shmctl(segment_id, IPC_RMID, NULL);
exit(EXIT_SUCCESS);
}
unsigned int timeMaxi = 540000;
int drive( int i ) {
unsigned int number;
while ( shared_memory[i].totalTime <= timeMaxi ) //time pas dépassée
{
number = generateNumber();
shared_memory[i].totalTime = number;
}
return 0;
}
void display(void) {
for (int i = 0; i < NUMBER_OF_CARS; i ){
printf("Total %d : %d\n", i, shared_memory[i].totalTime);
}
}
unsigned int generateNumber(void)
{
return rand()%(MAX-MIN 1) MIN;
}
結果 :
./prog
Total 0 : 564634
Total 1 : 564634
Total 2 : 564634
Total 3 : 564634
Total 4 : 564634
Total 5 : 564634
Total 6 : 564634
Total 7 : 564634
Total 8 : 564634
Total 9 : 564634
uj5u.com熱心網友回復:
您的共享記憶體沒有問題。問題是所有的孩子都以相同的亂數序列結束generateNumber()。srand()在所有分叉之前,您只呼叫一次,因此每個孩子都將生成完全相同的亂數。
在呼叫srand()之前呼叫每個孩子drive()。srand(time(NULL))還不夠,因為它們很可能都在同一秒內運行,但是您可以使用getpid()或 其他一些適當的方法作為引數,srand()以不同的方式在每個孩子中播種亂數生成器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326773.html
