C 操作系统、fork、共享内存和信号量
我正在做作业,这是赛道: 命令行给出2个数字:argv[1]=子数(n),argv[0]=变量(m) 父节点生成n个子节点并创建共享内存段。然后等到儿子们结束他们的工作 sons使用信号量修改必须写入并更新到共享内存中的变量m 当子对象结束时,父对象打印出包含在变量m中的值 这是新代码: [守则]C 操作系统、fork、共享内存和信号量,c,fork,shared-memory,semaphore,pid,C,Fork,Shared Memory,Semaphore,Pid,我正在做作业,这是赛道: 命令行给出2个数字:argv[1]=子数(n),argv[0]=变量(m) 父节点生成n个子节点并创建共享内存段。然后等到儿子们结束他们的工作 sons使用信号量修改必须写入并更新到共享内存中的变量m 当子对象结束时,父对象打印出包含在变量m中的值 这是新代码: [守则] #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/shm.h&
#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;
}
#包括
#包括
#包括
#包括
#包括
结构共享{//共享结构
扫描电镜;
int m;
};
无效错误(char*msg){//debug函数
PRITF(“%s错误。\n”);
返回1;
}
int main(int argc,char*argv[]){
int sid;//段id
结构共享*数据;
pid_t pid;
如果(argc您必须将共享变量放入共享内存中。一种方法是将其作为指向共享内存中某个位置的指针:
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` */
您需要信号量来防止同时访问共享内存。并将帮助您使用信号量和共享内存argv[0]将给出可执行文件的名称!!谢谢,然后[CODE]m=(*int)共享内存;[/CODE]是我需要将变量m放入共享内存的代码吗?我如何将信号量放入共享内存中?@user2611556您可以使用sem\u open
创建一个命名信号量,然后它就已经被共享了。我们在第一课中没有研究sem\u open。我只能使用我上面写的函数。好的,我管理了一点。I u更新了第一个主题中的代码。