人々がすでに指摘しているように、スレッドではなくプロセスを作成しています。プロセス間でデータを共有するのは困難です。すべてのプロセスには独自のメモリ アドレス空間があります。つまり、同じコードを共有できますが、データは非公開です。
プロセス間でデータを共有したい場合は、いくつかの手法があります。それらの1つは、メモリマップを使用した共有メモリです
#include <unistd.h> //has thread calls for fork()
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
struct globalInfo{
int x;
};
char *shm = "/asd8"; // change this before every run to avoid error 22
int dothis()
{
// sleep(1); // helps to simulate race condition
int len = sizeof(struct globalInfo);
int fd = shm_open(shm, O_RDWR, 0);
void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (addr == MAP_FAILED){
perror(""); // error handling
}
struct globalInfo *info = (struct globalInfo *)addr;
info->x++;
printf("%d %d\n", info->x, getpid());
return 0;
}
int main(){
struct globalInfo info = { .x = 2};
int len = sizeof(struct globalInfo);
int fd = shm_open(shm, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1)
perror(""); // error handling
if(ftruncate(fd, len) == -1){
printf("%d\n", errno); // osx produces error 22 don't know why
perror("");
}
void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
memcpy(addr, &info, len);
for(int i = 0 ; i < 5 ; i++)
{
if(fork() == 0)
{
dothis();
break;
}
}
}
サンプル出力
3 30588
4 30589
6 30590
6 30591
7 30592
また、 The Linux Programming Interface: A Linux and UNIX System Programming Handbook の章を読んでいただければ幸いです。
- 24 プロセスの作成
- 49 メモリマッピング
- 53 個の POSIX セマフォ (データが共有された後に同期の問題を解決する必要があります)
- 54 POSIX共有メモリ