2015-05-29 90 views
1

因爲我目前正在研究這個想法並在互聯網上亂搞,所以我現在無法提供代碼。不同的.c文件之間的IPC進程間通信

我已經瞭解了進程間通信並使用共享內存在進程間共享數據(特別是結構)。

但是,我對使用fork()和execv(...)在不同的.c文件中保存的程序後如何與進程共享數據感到困惑。

如果我們將信號量密鑰作爲參數傳遞給另一個程序(它變成一個子進程),我們是否可以通過semget訪問共享內存?

+1

您是否知道,一旦編譯了程序,不同的'.c'文件或單個大'.c'文件幾乎沒有區別? – Eregrith

回答

0

首先要做的事情。

  1. 取決於執行,單個或多個源文件(S),.c你的情況可以構成一個單一的可執行文件。單個可執行文件運行一個進程。如果源代碼中有fork(),則創建子進程。所以,你的

    ...不同的.c文件

    之間的進程間通信不一定需要2個.c文件,不論他們是否被編譯爲一個單一的項目或兩個不同的項目。

  2. 爲了簡單說一下,你有兩個不同的源文件,其中一個應該創建一個共享內存。

    #define SHMSPACE 35 
    char *shm, *str; 
    key_t key = 1234; 
    
    //Create a memory segment to be shared 
    if ((shmid = shmget(key, SHMSPACE, IPC_CREAT | 0666)) < 0) 
    { 
        perror("shmget failed"); 
        exit(1); 
    } 
    
    //Attach the segment to memory space. 
    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) 
    { 
        perror("shmat failed"); 
        exit(1); 
    } 
    
    //Write something like A to Z in the shared memory for other process to read 
    str = shm; 
    for (c = 'A'; c <= 'Z'; c++) //c is declared as an int somewhere above. 
        *str++ = c; 
    *str = NULL; 
    

    你其它來源應該是:

    #define SHMSPACE 35 
    char *shm, *str; 
    key_t key = 1234; 
    
    //Get the shared memory segment 
    if ((shmid = shmget(key, SHMSPACE, 0666)) < 0) 
    { 
        perror("shmget failed"); 
        exit(1); 
    } 
    
    //Attach the segment to our data space. 
    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) 
    { 
        perror("shmat"); 
        exit(1); 
    } 
    
    //Read what other process has put in the memory. 
    for (str = shm; *str != NULL; s++) 
        putchar(*str); 
    
0

在假設說「兩種不同的C文件」你的意思是「兩個不同的過程(即兩個C與主文件()在他們中)」。

要解決此問題,您可以使用共享內存空間。您可以使用shm_open使用名稱創建一個內存空間。該名稱是此空間的唯一標識符。您也可以將O_CREAT|O_EXCL作爲參數傳遞給shm_open函數。這允許您定義空間將被創建,並且它是獨佔的(即空間不存在)。 shm_open函數的返回是一個文件描述符。

因此,第一個線程可以將其映射爲Exclusive,第二個線程可以刪除O_EXCL參數以將其映射爲現有映射。因此你現在有一個進程可以使用的內存空間。

要使用它,必須將空間映射到兩個進程的內存空間。假設你有一個你想用來在進程間傳遞數據的結構。

從截斷由文件描述符指定的文件大小開始。因此,您使用ftruncate(shm_file_descriptor, sizeof(struct shm_structure)) 一旦它的大小適當,您可以使用mmap將其映射到適當的大小。

shmp = mmap(arg1,arg2,arg3) 

您現在可以像訪問shmp->first_field那樣訪問共享內存空間。

其中:

struct shm_struct { uint8_t first_field;}; 

您現在有一個共享的內存空間,這屬於兩個過程(假設你已經創建並映射的空間,這兩個過程)。你必須決定如何控制對這個空間的訪問。一個簡單的方法是添加一個控制系統(互斥體,信號量等),它只允許一個進程在任何時候讀寫該空間。控制將由您本質上寫。在讀/寫之前,您必須檢查您是否獲得了鎖。

有許多方法可以實現這種控制機制。