因爲我目前正在研究這個想法並在互聯網上亂搞,所以我現在無法提供代碼。不同的.c文件之間的IPC進程間通信
我已經瞭解了進程間通信並使用共享內存在進程間共享數據(特別是結構)。
但是,我對使用fork()和execv(...)在不同的.c文件中保存的程序後如何與進程共享數據感到困惑。
如果我們將信號量密鑰作爲參數傳遞給另一個程序(它變成一個子進程),我們是否可以通過semget訪問共享內存?
因爲我目前正在研究這個想法並在互聯網上亂搞,所以我現在無法提供代碼。不同的.c文件之間的IPC進程間通信
我已經瞭解了進程間通信並使用共享內存在進程間共享數據(特別是結構)。
但是,我對使用fork()和execv(...)在不同的.c文件中保存的程序後如何與進程共享數據感到困惑。
如果我們將信號量密鑰作爲參數傳遞給另一個程序(它變成一個子進程),我們是否可以通過semget訪問共享內存?
首先要做的事情。
取決於執行,單個或多個源文件(S),.c
你的情況可以構成一個單一的可執行文件。單個可執行文件運行一個進程。如果源代碼中有fork()
,則創建子進程。所以,你的
...不同的.c文件
之間的進程間通信不一定需要2個.c
文件,不論他們是否被編譯爲一個單一的項目或兩個不同的項目。
爲了簡單說一下,你有兩個不同的源文件,其中一個應該創建一個共享內存。
#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);
在假設說「兩種不同的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;};
您現在有一個共享的內存空間,這屬於兩個過程(假設你已經創建並映射的空間,這兩個過程)。你必須決定如何控制對這個空間的訪問。一個簡單的方法是添加一個控制系統(互斥體,信號量等),它只允許一個進程在任何時候讀寫該空間。控制將由您本質上寫。在讀/寫之前,您必須檢查您是否獲得了鎖。
有許多方法可以實現這種控制機制。
您是否知道,一旦編譯了程序,不同的'.c'文件或單個大'.c'文件幾乎沒有區別? – Eregrith