/*
* shared memory - header file
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <semaphore.h>
#define SHMKEY 0x123
#define PERMS 0666
extern int errno;
typedef struct
{
sem_t sem1;
sem_t sem2;
}CFG_SHM;
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
int main(void)
{
int childpid;
int val;
CFG_SHM *cfgshmPtr,cfgdata;
int shmid;
shmid = shmget(SHMKEY,sizeof(CFG_SHM),IPC_CREAT|PERMS); //create the shared
if(shmid < 0) //memory segment
{
printf("Error in getting shared memory, %s",strerror(errno));
exit(0);
}
cfgshmPtr = (CFG_SHM *) shmat(shmid,0,0);
if(cfgshmPtr == (CFG_SHM *) 0)
{
printf("Error in attaching shared memory, %s",strerror(errno));
exit(0);
}
memcpy((void *)&cfgdata,(void *)cfgshmPtr,sizeof(CFG_SHM));
sem_init(&(cfgshmPtr->sem1), 0, 1);
sem_init(&(cfgshmPtr->sem2), 0, 0);
childpid=fork();
if(childpid < 0)
{
printf("Fork failed\n");
exit(1);
}
if (childpid==0)
{
int OddNum=1;
printf("The number is 1 Odd \n");
while (OddNum < 9)
{
shmid = shmget(SHMKEY,sizeof(CFG_SHM),IPC_CREAT|PERMS); //create the shared
if(shmid < 0) //memory segment
{
printf("Error in getting shared memory, %s",strerror(errno));
exit(0);
}
cfgshmPtr = (CFG_SHM *) shmat(shmid,0,0); //attach it to the
if(cfgshmPtr == (CFG_SHM *) 0) //process
{
printf("Error in attaching shared memory, %s",strerror(errno));
exit(0);
}
/*
sem_getvalue(&(cfgshmPtr->sem1), &val);
printf("Child :The sem1 value is %d \n", val);
sem_getvalue(&(cfgshmPtr->sem2), &val);
printf("Child :The sem2 value is %d \n", val);
*/
sem_wait(&(cfgshmPtr->sem2));
OddNum=OddNum+2;
printf("The number is %d Odd \n", OddNum);
sem_post(&(cfgshmPtr->sem1));
if(shmdt(cfgshmPtr) < 0) //detach the shared memory segment
printf("Error in detaching shared memory segment, %s\n",strerror(errno));
}
}
else
{
int EvenNum=0;
while (EvenNum < 10)
{
shmid = shmget(SHMKEY,sizeof(CFG_SHM),IPC_CREAT|PERMS); //create the shared
if(shmid < 0) //memory segment
{
printf("Error in getting shared memory, %s",strerror(errno));
exit(0);
}
cfgshmPtr = (CFG_SHM *) shmat(shmid,0,0); //attach it to the
if(cfgshmPtr == (CFG_SHM *) 0) //process
{
printf("Error in attaching shared memory, %s",strerror(errno));
exit(0);
}
/*
sem_getvalue(&(cfgshmPtr->sem1), &val);
printf("Parent :The sem1 value is %d \n", val);
sem_getvalue(&(cfgshmPtr->sem2), &val);
printf("Parent :The sem2 value is %d \n", val);
*/
sem_wait(&(cfgshmPtr->sem1));
EvenNum=EvenNum+2;
printf("The number is %d Even \n", EvenNum);
sem_post(&(cfgshmPtr->sem2));
if(shmdt(cfgshmPtr) < 0) //detach the shared memory segment
printf("Error in detaching shared memory segment, %s\n",strerror(errno));
}
if(shmctl(shmid,IPC_RMID,0) < 0) //remove the shared memory segment
printf("Error in removing shared memory segment, %s\n",strerror(errno));
else
printf("Shared memory removed successfully\n");
}
}
LyoKICogc2hhcmVkIG1lbW9yeSAtIGhlYWRlciBmaWxlCiAqCiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL2lwYy5oPgojaW5jbHVkZSA8c3lzL3NobS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgoKI2RlZmluZSBTSE1LRVkgICAgICAgICAgMHgxMjMKI2RlZmluZSBQRVJNUyAgICAgICAgICAgMDY2NgoKZXh0ZXJuIGludCBlcnJubzsKCnR5cGVkZWYgc3RydWN0IAp7CiAgc2VtX3Qgc2VtMTsgCiAgc2VtX3Qgc2VtMjsKfUNGR19TSE07CgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKCmludCBtYWluKHZvaWQpCnsKICAgaW50IGNoaWxkcGlkOwogICBpbnQgdmFsOwogICBDRkdfU0hNICpjZmdzaG1QdHIsY2ZnZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGludCBzaG1pZDsKCglzaG1pZCA9IHNobWdldChTSE1LRVksc2l6ZW9mKENGR19TSE0pLElQQ19DUkVBVHxQRVJNUyk7ICAgLy9jcmVhdGUgdGhlIHNoYXJlZAoJaWYoc2htaWQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVtb3J5IHNlZ21lbnQKCXsKCQlwcmludGYoIkVycm9yIGluIGdldHRpbmcgc2hhcmVkIG1lbW9yeSwgJXMiLHN0cmVycm9yKGVycm5vKSk7CgkJZXhpdCgwKTsKCX0KCWNmZ3NobVB0ciA9IChDRkdfU0hNICopIHNobWF0KHNobWlkLDAsMCk7ICAgICAgCglpZihjZmdzaG1QdHIgPT0gKENGR19TSE0gKikgMCkgICAgICAgICAgICAgICAgCgl7CgkJcHJpbnRmKCJFcnJvciBpbiBhdHRhY2hpbmcgc2hhcmVkIG1lbW9yeSwgJXMiLHN0cmVycm9yKGVycm5vKSk7CgkJZXhpdCgwKTsKCX0KICBtZW1jcHkoKHZvaWQgKikmY2ZnZGF0YSwodm9pZCAqKWNmZ3NobVB0cixzaXplb2YoQ0ZHX1NITSkpOwoKICAKCXNlbV9pbml0KCYoY2Znc2htUHRyLT5zZW0xKSwgMCwgMSk7CiAgICBzZW1faW5pdCgmKGNmZ3NobVB0ci0+c2VtMiksIDAsIDApOwoJY2hpbGRwaWQ9Zm9yaygpOwoJaWYoY2hpbGRwaWQgPCAwKQoJewoJCXByaW50ZigiRm9yayBmYWlsZWRcbiIpOwoJCWV4aXQoMSk7Cgl9CglpZiAoY2hpbGRwaWQ9PTApCgl7CgkJaW50IE9kZE51bT0xOwoJCXByaW50ZigiVGhlIG51bWJlciBpcyAxIE9kZCBcbiIpOwoJCXdoaWxlIChPZGROdW0gPCA5KQoJCXsKCQkJc2htaWQgPSBzaG1nZXQoU0hNS0VZLHNpemVvZihDRkdfU0hNKSxJUENfQ1JFQVR8UEVSTVMpOyAgIC8vY3JlYXRlIHRoZSBzaGFyZWQKCQkJaWYoc2htaWQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVtb3J5IHNlZ21lbnQKCQkJewoJCQkJcHJpbnRmKCJFcnJvciBpbiBnZXR0aW5nIHNoYXJlZCBtZW1vcnksICVzIixzdHJlcnJvcihlcnJubykpOwoJCQkJZXhpdCgwKTsKCQkJfQogCQkgICAgY2Znc2htUHRyID0gKENGR19TSE0gKikgc2htYXQoc2htaWQsMCwwKTsgICAgIC8vYXR0YWNoIGl0IHRvIHRoZSAKCQkgICAgaWYoY2Znc2htUHRyID09IChDRkdfU0hNICopIDApICAgICAgICAgICAgICAgIC8vcHJvY2VzcwoJCSAgICB7CgkJCQlwcmludGYoIkVycm9yIGluIGF0dGFjaGluZyBzaGFyZWQgbWVtb3J5LCAlcyIsc3RyZXJyb3IoZXJybm8pKTsKCQkJCWV4aXQoMCk7CgkJICAgIH0KCQkvKgoJCQlzZW1fZ2V0dmFsdWUoJihjZmdzaG1QdHItPnNlbTEpLCAmdmFsKTsKCQkJcHJpbnRmKCJDaGlsZCA6VGhlIHNlbTEgdmFsdWUgaXMgJWQgXG4iLCB2YWwpOwoJCSAgICBzZW1fZ2V0dmFsdWUoJihjZmdzaG1QdHItPnNlbTIpLCAmdmFsKTsKCQkJcHJpbnRmKCJDaGlsZCA6VGhlIHNlbTIgdmFsdWUgaXMgJWQgXG4iLCB2YWwpOwoJICAgICAqLwoJCQlzZW1fd2FpdCgmKGNmZ3NobVB0ci0+c2VtMikpOwoJCQlPZGROdW09T2RkTnVtKzI7CgkJCXByaW50ZigiVGhlIG51bWJlciBpcyAlZCBPZGQgXG4iLCBPZGROdW0pOwoJCQlzZW1fcG9zdCgmKGNmZ3NobVB0ci0+c2VtMSkpOwogICAgCQlpZihzaG1kdChjZmdzaG1QdHIpIDwgMCkgICAgICAgICAgICAgICAgIC8vZGV0YWNoIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgCiAgICAgICAgICAgIHByaW50ZigiRXJyb3IgaW4gZGV0YWNoaW5nIHNoYXJlZCBtZW1vcnkgc2VnbWVudCwgJXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKCQl9Cgl9CgllbHNlCgl7CgkJaW50IEV2ZW5OdW09MDsKCQl3aGlsZSAoRXZlbk51bSA8IDEwKQoJCXsgICAKCQkJc2htaWQgPSBzaG1nZXQoU0hNS0VZLHNpemVvZihDRkdfU0hNKSxJUENfQ1JFQVR8UEVSTVMpOyAgIC8vY3JlYXRlIHRoZSBzaGFyZWQKCQkJaWYoc2htaWQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVtb3J5IHNlZ21lbnQKCQkJewoJCQkJcHJpbnRmKCJFcnJvciBpbiBnZXR0aW5nIHNoYXJlZCBtZW1vcnksICVzIixzdHJlcnJvcihlcnJubykpOwoJCQkJZXhpdCgwKTsKCQkJfQogCQkgICAgY2Znc2htUHRyID0gKENGR19TSE0gKikgc2htYXQoc2htaWQsMCwwKTsgICAgIC8vYXR0YWNoIGl0IHRvIHRoZSAKCQkgICAgaWYoY2Znc2htUHRyID09IChDRkdfU0hNICopIDApICAgICAgICAgICAgICAgIC8vcHJvY2VzcwoJCSAgICB7CgkJCQlwcmludGYoIkVycm9yIGluIGF0dGFjaGluZyBzaGFyZWQgbWVtb3J5LCAlcyIsc3RyZXJyb3IoZXJybm8pKTsKCQkJCWV4aXQoMCk7CgkJICAgIH0KCQkvKgoJCQlzZW1fZ2V0dmFsdWUoJihjZmdzaG1QdHItPnNlbTEpLCAmdmFsKTsKCQkJcHJpbnRmKCJQYXJlbnQgOlRoZSBzZW0xIHZhbHVlIGlzICVkIFxuIiwgdmFsKTsKCQkgICAgc2VtX2dldHZhbHVlKCYoY2Znc2htUHRyLT5zZW0yKSwgJnZhbCk7CgkJCXByaW50ZigiUGFyZW50IDpUaGUgc2VtMiB2YWx1ZSBpcyAlZCBcbiIsIHZhbCk7CgkgICAgKi8KCQkJc2VtX3dhaXQoJihjZmdzaG1QdHItPnNlbTEpKTsKCQkJRXZlbk51bT1FdmVuTnVtKzI7CgkJCXByaW50ZigiVGhlIG51bWJlciBpcyAlZCBFdmVuIFxuIiwgRXZlbk51bSk7CgkJCXNlbV9wb3N0KCYoY2Znc2htUHRyLT5zZW0yKSk7CgkJCWlmKHNobWR0KGNmZ3NobVB0cikgPCAwKSAgICAgICAgICAgICAgICAgLy9kZXRhY2ggdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAKICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBpbiBkZXRhY2hpbmcgc2hhcmVkIG1lbW9yeSBzZWdtZW50LCAlc1xuIixzdHJlcnJvcihlcnJubykpOwoJCX0KCQkgIGlmKHNobWN0bChzaG1pZCxJUENfUk1JRCwwKSA8IDApICAgICAgICAgICAvL3JlbW92ZSB0aGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50CgkJCSBwcmludGYoIkVycm9yIGluIHJlbW92aW5nIHNoYXJlZCBtZW1vcnkgc2VnbWVudCwgJXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKCQkgIGVsc2UKCQkJcHJpbnRmKCJTaGFyZWQgbWVtb3J5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKCgl9Cn0KCgoK