2016-01-09 55 views
1

我想通過fork派出一些任務,並收集有關數組中這些任務結果的一些信息。使用mmap添加到結構數組

我的想法是使用mmap在兩者之間共享數據結構,並讓子進程用活動的結果更新結構數組,但我遇到了一些問題。

#include <time.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdio.h> 
#include <sys/mman.h> 
#include <stdlib.h> 


typedef struct message_s { 
    int status; 
    char message[256]; 
} message_t; 


void child(message_t **result) { 


    result[0]->status = 2; 
    sprintf((char *) &result[0]->message, "Hello World!"); 
    usleep(1); 

} 

void parent() { 
    printf("Parent\n"); 
    usleep(1); 
    return; 
} 


int main() { 
    size_t result_size = 1000 * sizeof(message_t); 


    message_t **result_ar = mmap(NULL, result_size, 
           PROT_READ | PROT_WRITE, 
           MAP_SHARED | MAP_ANON, -1, 0); 


    pid_t child_pid = fork(); 

    switch (child_pid) { 
     case 0: 
      child(result_ar); 
      exit(0); 

     case -1: 
      exit(-1); 
      break; 
     default: 
      parent(); 
    } 

    int child_status; 
    waitpid(child_pid, &child_status, 0); 


    printf("\nRESULT: %i: %s\n\n", result_ar[0]->status, result_ar[0]->message); 

    msync(result_ar, result_size, MS_SYNC); 
    munmap(result_ar, result_size); 

    return 0; 
} 

我真的有點迷失在這裏,雖然我可以找到如此「相似」的問題,他們要麼沒有答案,或者其他問題,或者兩者都困擾。

當上面的代碼運行時,我得到下面的連接結果。

Process:    concurrent_test [2537] 
Path:     /Users/USER/Library/Caches/*/concurrent_test 
Identifier:   concurrent_test 
Version:    0 
Code Type:    X86-64 (Native) 
OS Version:   Mac OS X 10.10.5 (14F1509) 
Report Version:  11 

Crashed Thread:  0 Dispatch queue: com.apple.main-thread 

Exception Type:  EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes:  KERN_INVALID_ADDRESS at 0x0000000000000000 

VM Regions Near 0: 
--> 
    __TEXT     000000010144a000-000000010144c000 [ 8K] r-x/rwx SM=COW /Users/USER/Library/Caches/* 

Application Specific Information: 
crashed on child side of fork pre-exec 

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 concurrent_test     0x000000010144bb33 child + 35 
1 concurrent_test     0x000000010144bc1f main + 127 
2 concurrent_test     0x000000010144b5a9 _start + 247 
3 concurrent_test     0x000000010144b4b1 start + 33 

Thread 0 crashed with X86 Thread State (64-bit): 
    rax: 0x0000000000000000 rbx: 0x00007fff5e7b5908 rcx: 0x000000010144beb3 rdx: 0xffffffffffffffff 
    rdi: 0x0000000000000000 rsi: 0x0000000000000000 rbp: 0x00007fff5e7b5730 rsp: 0x00007fff5e7b5720 
    r8: 0x0000000000000303 r9: 0x0000000000000000 r10: 0x0000000000000030 r11: 0x0000000000000206 
    r12: 0x00007fff5e7b57e0 r13: 0x0000000000000000 r14: 0x00007fff5e7b57f0 r15: 0x0000000000000001 
    rip: 0x000000010144bb33 rfl: 0x0000000000010246 cr2: 0x0000000000000000 

Logical CPU:  6 
Error Code:  0x00000006 
Trap Number:  14 

而且我使用:

Apple LLVM version 7.0.2 (clang-700.1.81) 
Target: x86_64-apple-darwin14.5.0 
Thread model: posix 

回答

2

你有一個間接的代碼太多。嘗試使用message_t *result_ar = mmap(...);result[0].status = 2;來解決此問題。另外,不要忘記錯誤檢查! mmap()可能會失敗。

+0

幾乎所有的東西都可能會失敗,但由於簡潔的原因,它大部分都沒有錯誤檢查功能。這就是說,謝謝你的提示,它完全解決了我的問題! – lscoughlin