我正在做的家庭作業,這是軌道:手術系統,叉,共享內存和信號燈
命令行得到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]
你覺得呢?預先感謝您
的argv [0]將給出可執行文件的文件名! – sujin