共享内存未更新

时间:2019-10-03 16:06:38

标签: c exec mmap

因此,我一直在尝试学习有关共享内存的更多信息。我正在主服务器中创建共享内存结构,并派生了孩子。然后每个孩子都使用execv创建一个新进程。当我尝试从新进程更改共享内存的值时,父级看不到该更改。我也期待父母与孩子交织执行。例如

Child 1 exec 
parent 
child 2 exec 
parent 
child 3 exec
parent 

但是我却得到了

child 1 exec 
child 2 exec 
child 3 exec 
parent
parent
parent

这是我的代码

模拟.c

# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <time.h>
# include <stdlib.h>
# include <dirent.h>
# include <stdio.h>
# include <string.h>
# include <getopt.h>
# include <stdbool.h>
# include <ctype.h>
# include <sys/wait.h>
# include <signal.h>
# include <sys/mman.h>
# include <sys/time.h>
# include <stdint.h>
# include <fcntl.h>
# include <sys/shm.h>
struct sharedregion{
    volatile int seconds;
    volatile int sharedmsg;
};
struct sharedregion *mystruct;
void spawnchild()
{
    int fd = shm_open("sharedmemory", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRWXG | S_IRWXU);
    if (fd == -1)
        perror("Error in opening");
    if (ftruncate(fd, sizeof(struct sharedregion)) == -1)
        perror("Unable to truncate");
    mystruct = mmap(NULL, sizeof(struct sharedregion),PROT_READ | PROT_WRITE, MAP_SHARED| MAP_ANONYMOUS, fd, 0);
    if (mystruct == MAP_FAILED)
        perror("mapping failed");
    mystruct->seconds=0;
    mystruct->sharedmsg=0;
    int i;
    for(i=0;i<4;i++)
    {
        pid_t pID = fork();

        if (pID == 0)
        {
            static char *args[]={"./child",NULL};

            execv(args[0], args);
            perror("failed to execv");
            exit(EXIT_FAILURE);

        }
        else if (pID < 0)            // failed to fork
        {
            perror(" Failed to fork:");
            exit(EXIT_FAILURE);
        }
        else if(pID>0)
        {

            printf("\nfrom parent= %d",mystruct->sharedmsg);
            mystruct->seconds=mystruct->seconds+1;
            if(mystruct->seconds==1000000000)
            {
                mystruct->seconds=1;
            }
        }
    }
}
int main(int argc, char **argv)
{
    spawnchild();
}

child.c

# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <time.h>
# include <stdlib.h>
# include <dirent.h>
# include <stdio.h>
# include <string.h>
# include <getopt.h>
# include <stdbool.h>
# include <ctype.h>
# include <sys/wait.h>
# include <signal.h>
# include <sys/mman.h>
# include <sys/time.h>
# include <stdint.h>
# include <fcntl.h>
# include <sys/shm.h>
struct sharedregion{
    volatile int seconds;
        volatile int sharedmsg;
};
struct sharedregion *mystruct;

int main(int argc, char **argv)
{
    int memFd = shm_open("sharedmemory", O_RDWR, S_IRUSR | S_IWUSR | S_IRWXG | S_IRWXU);
    if (memFd == -1)
    {
        perror("Can't open file");
        return 1;
    }

    mystruct = mmap(NULL, sizeof (struct sharedregion), PROT_READ | PROT_WRITE, MAP_SHARED| MAP_ANONYMOUS, memFd, 0);

    printf("\nhello from exec");
    mystruct->sharedmsg=8;
    printf("buffer %d",mystruct->sharedmsg);

    return 0;
}

我的输出

hello from execbuffer 8
hello from execbuffer 8
hello from execbuffer 8
hello from execbuffer 8
hello from execbuffer 8
from parent= 0
from parent= 0
from parent= 0
from parent= 0
from parent= 0

1 个答案:

答案 0 :(得分:2)

删除标志MAP_ANONYMOUS

根据手册:

  

MAP_ANONYMOUS                 [...] fd参数被忽略;

因此它会忽略您的共享内存