i want to share an array between 2 process (a master and a child). I have to use shared memory as a requirement of the project. But how can initialize the array? It give me back cast error and i didn't found anything that can help in other questions..Thanks
the warning says:
master.c: In function ‘main’:
master.c:17:14: warning: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
17 | *nodeList = (int*)shmat(shmid,NULL,0);
master.c :
#include "config.h"
int main(int argc, char const *argv[]){
pid_t userList[SO_USERS_NUM];
int nodeList[SO_NODES_NUM];
char *argsUser[3] = { CHILD_NAME };
char *argsNode[3] = { NODE_NAME };
int userID = -1;
int nodeID = -1;
int shmid;
shmid = shmget(SH_KEY,SO_NODES_NUM*sizeof(int),IPC_CREAT);
if(shmid == -1) {
perror("shmget error");
exit(EXIT_FAILURE);
}
*nodeList = (int*)shmat(shmid,NULL,0);
// shmdt((void *) nodeList);
#ifndef SO_USERS_NUM
printf("Error in main: SO_USERS_NUM not defined");
#endif
for (int i = 0; i < SO_NODES_NUM; i++) {
++nodeID;
char test[100];
pid_t pid = fork();
switch (pid) {
case 0:
sprintf(test, "%d", nodeID);
argsNode[1] = test;
argsNode[2] = NULL;
execvp(argsNode[0], argsNode);
exit(EXIT_FAILURE);
break;
case -1:
printf("Error in main: fork failed");
break;
default:
printf("master: launch node %d (pid %d)\n",nodeID,pid);
nodeList[nodeID] = pid;
break;
}
}
for (int i = 0; i < SO_USERS_NUM; i++) {
++userID;
char test[100];
pid_t pid = fork();
switch (pid) {
case 0:
sprintf(test, "%d", userID);
argsUser[1] = test;
argsUser[2] = NULL;
execvp(argsUser[0], argsUser);
exit(EXIT_FAILURE);
break;
case -1:
printf("Error in main: fork failed");
break;
default:
printf("master: launch user %d (pid %d)\n",userID,pid);
userList[userID] = pid;
break;
}
}
printf("\n");
for (int i = 0; i < SO_NODES_NUM+SO_NODES_NUM; i++)
{
int pid_finished = wait(NULL);
for (int s = 0; s < SO_NODES_NUM; s++)
{
if(pid_finished == nodeList[s])printf("\nMaster finished to wait a child node. PID: %d",pid_finished);
}
for (int y = 0; y < SO_USERS_NUM; y++)
{
if(pid_finished == userList[y])printf("\nMaster finished to wait a child user. PID: %d",pid_finished);
}
}
return 0;
}
user.c :
#include "config.h"
int main(int argc, char const *argv[])
{
int shmid = shmget(SH_KEY,SO_NODES_NUM*sizeof(pid_t),IPC_EXCL);
printf("i'm a child");
int* nodeList = (int*)shmat(shmid, NULL, 0);
printf("\n");
for (int i = 0; i < SO_NODES_NUM; i++)
{
printf("\nNODE: %d",nodeList[i]);
}
return 0;
}
in config.h :
#define KEY_QUEUE 0x200800
#define SH_KEY 123456
/*
NODE_NAME name of nodes's code lauched by execvp
*/
#define NODE_NAME "./node"
/*
CHILD_NAME name of users's code lauched by execvp
*/
#define CHILD_NAME "./user"
NodeListis a pointer, you dereference a pointer to an integer and then try to assign it to a type ofint *, and keep in mind that in C it's legal to assignvoid*toint*without a cast to the type-cast is uneeded.