2013-07-23 58 views
0

我正在做的家庭作業,這是軌道:手術系統,叉,共享內存和信號燈

命令行得到2號:的argv [1] =子(n)的的argv數[0] =變量(m) 父親生成n個兒子並創建共享內存段。然後等到兒子結束他們的工作。

兒子們用信號量來修改必須寫入並更新到共享內存中的變量m。

當兒子結束時,父親打印出變量m中包含的值。

這是新代碼:

[CODE]

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/shm.h> 
#include <semaphore.h> 

struct shared { // shared structure 
    sem_t sem; 
    int m; 
}; 

void error(char *msg) { // debug function 
    pritnf("%s error.\n"); 
    return 1; 
} 

int main(int argc, char *argv[]) { 

    int sid; // segment id 
    struct shared *data;  
    pid_t pid; 

    if(argc<3) error("argc"); 

    if(argv[1]<0) error("argv"); 

    if(sid = shmget(IPC_PRIVATE, sizeof(shared *data),0666)<0) error("sid-shmget"); // father create sid 

    if(data = (struct shared*) shmat(sid,(void *)0,1)<0) error("data-shmat"); // father allocate structure into his address scope 

    data.m = argv[2]; // father initialize m 

    if(sem_init(&data.sem)<0) error("sem_init"); // father initialize semaphore 

    for (int i=0; i<atoi(argv[1]);i++) { // create sons 
     if((pid = fork())<0) error("fork"); 
    } 

    if (pid>0) { // father 
     wait(NULL); // wait for sons 
     sem_wait(&data.sem); // entry section 
     printf("valore: %d\n", data.m); 
     sem_post(&data.sem); // exit section 

    } else { // son 
     if(data = (struct shared*) shmat(sid,(void *)0,1)<0) error("shmat"); // son allocate data into his address scope 

     sem_wait(data.sem); // entry section 

       if (data.m%2 != 0) data.m*=2; // modify variable 
     else data.m-=1; 

       sem_post(&data.m); // exit section 
     } 

    shmdt(&data); // father and sons deallocate data 

    if (pid>0) { // father delete semaphore and sid 
     sem_delete(&data.sem); 
     shmctl(sid,IPC_RMID,0); 
    } 

return 0; 
} 

[/ CODE]

你覺得呢?預先感謝您

+0

的argv [0]將給出可執行文件的文件名! – sujin

回答

0

您必須將共享變量放置在共享內存中。這樣做的一個辦法是讓它成爲一個指向某處共享內存:

int *m; 

/* ... */ 

/* In the first process... */ 
m = (int *) shared_memory; 
*m = 5; /* Initialize `m` to the value `5` */ 

/* In the second process... */ 
m = (int *) shared_memory; 
*m += 10; /* Add `10` to the shared variable `m` */ 

/* Back in the first process */ 
printf("%d\n", *m); /* Will print `15` */ 

您需要的信號,以防止共享內存同時訪問。

+0

謝謝,那麼[CODE] m =(* int)共享內存; [/ CODE]是我需要將變量m放入共享內存的代碼?如何將信號放入shared_memory內? – user2611556

+0

@ user2611556你可以使用'sem_open'創建一個指定的信號量,然後它將被共享。 –

+0

我們在課上沒有學習sem_open。我只能使用像我上面寫的功能.. – user2611556