在這之間是利用shared memory來傳遞資料的!
#include
#include
#include
#include
#include "../lib/string.c"
#define MAX_SEQUENCE 10
#define DEBUG 1
typedef struct {
long seq[MAX_SEQUENCE];
int seq_size;
} shared_data;
int main(int argc, char* argv[]){
int segment_id, pid;
char *shared_memory;
shared_data fib_seq;
const int size = 4096;
if(argc != 2){
fprintf(stderr, "Usage: %s seq_size\n", argv[0]);
return -1;
}
fib_seq.seq_size = atoi(argv[1]);
if(fib_seq.seq_size > MAX_SEQUENCE){
fprintf(stderr, "seq_size overflow.\n");
return -1;
}
segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR);
if(!(pid = fork())){
shared_memory = (char *) shmat(segment_id, NULL, 0);
fib_seq.seq[0] = 0;
fib_seq.seq[1] = 1;
int i;
if(DEBUG) fprintf(stderr, "Counting Fabonacii...\n");
for(i = 2; i < fib_seq.seq_size; i++)
fib_seq.seq[i] = fib_seq.seq[i-2] + fib_seq.seq[i-1];
if(DEBUG) fprintf(stderr, "Converting each int to string...\n");
char* fib_str[fib_seq.seq_size];
for(i = 0; i < fib_seq.seq_size; i++)
fib_str[i] = itoa(fib_seq.seq[i]);
if(DEBUG) fprintf(stderr, "Join the seq to string...\n");
char* return_str = join_strings(fib_str, fib_seq.seq_size, ',');
sprintf(shared_memory, "%s\n", return_str);
shmdt(shared_memory);
return 0;
}else{
wait(NULL);
if(DEBUG) fprintf(stderr, "Back to parent...\n");
shared_memory = (char *) shmat(segment_id, NULL, 0);
printf("%s", shared_memory);
shmdt(shared_memory);
shmctl(segment_id, IPC_RMID, NULL);
return 0;
}
}
在DEBUG訊息中都有寫上註解了。
簡單說明一下sharedmem的一些system call
segment_id = sgmget(....) //分配shared memory的空間
shared_memory = (char *) shmat(....) //使程式取得該shared mem的pointer
shmdt(shared_memory) //中斷與shared mem的連結
shmctl(...) //清除shared mem region
沒有留言:
張貼留言