close
IPC(Inter-Process Communication) - fork and shared memoryfork:Linux 程式設計下常用到的 fork(),功能是從父子程複制一個子行程,這是在有支援mmu的環境下才能使用。像uclinux,就不能用fork() 只能用vfork(),因為fork的實作是利用copy-on-write因此一定要有MMU。常用到fork加 exec函式來開啟一個新的子行程,功能類似windows的 CreateProcess。參考函式如下pid_t spawn(char *prog, char **arg_list){ pid_t pid = fork(); switch (pid) { case -1: perror("fork failed"); exit(1); case 0: // spawn the child process 住商房屋execvp(prog, arg_list); break; default: // parent break; } return pid;}例如: char *arg_list[] = {"ps", "-aux", NULL};spawn("ps", arg_list);shared_memory:主要是多個行程用來共享資料用的,需include 。主要有四個函式1. extern int shmget (key_t __key, size_t __size, int __shmflg) __THROW;新建或取得一塊shared memory,__key用來辨識不同塊的shared memory, 回傳是一個id用來操作shared memory。2. extern void *shmat (int __shmid, __const void *__shmaddr, int __shmflg) __THROW;連結到已產生的shared memory,輸入的__shmid為shmget的回傳值。3. extern int shmdt 裝潢(__const void *__shmaddr) __THROW;切斷目前process和shared memory的連結,但是這裡並沒有釋放這塊shared memory!4.extern int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf) __THROW; 控制shared memory,__cmd輸入IPC_RMID的話,就是刪除這塊shared memory的意思。測試: 1. 主程式建立一塊 shared memory2. 主程式fork 出一個子程式3. 主程式開啟 shared memory,等待使用者輸資料,存入到shared memory中4. 子程式判斷如果shared memory中有資料的話,就印出,然後再清除它5. 重覆3~46. 主程式輸入"exit",跳出迴圈,等待子程式結束7. 子程式收到"exit",結束程式,並切斷與 shared memory的連結8. 等到子程式已結束,主程式切斷與 shared memory的連結,並釋放shared memory,結束程式typedef struct sh_mem{ char data[1024];}sh_mem_t;#define 褐藻醣膠msleep(ms) usleep(ms*1000)const key_t key = 1234;void child_process(){ int shmid = shmget(key, sizeof(sh_mem_t), 0666 | IPC_CREAT); if (shmid == -1) { printf("shmget failed\r\n"); exit(EXIT_FAILURE); } // get shared memory void *shared_memory = shmat(shmid, NULL, 0); if (shared_memory == (void*)-1) { printf("shmat failed\r\n"); exit(EXIT_FAILURE); } sh_mem_t *p = 售屋網(sh_mem_t*)shared_memory; while (1) { if (strncmp(p->data, "exit", strlen("exit")) == 0) { break; } if (strlen(p->data) > 0) { printf("child:%s\n", p->data); bzero(p->data, sizeof(p->data)); } msleep(10); 住商房屋} if (shmdt(shared_memory) == -1) { printf("child, shmdt failed\r\n"); exit(EXIT_FAILURE); }}int main(void){ // create shared memory int shmid = shmget(key, sizeof(sh_mem_t), 0666 | IPC_CREAT); if (shmid == -1) { printf("shmget failed\r\n"); exit(EXIT_FAILURE); } void *shared_memory = shmat(shmid, NULL, 0); if (shared_memory == (void*)-1) { 帛琉 printf("shmat failed\r\n"); exit(EXIT_FAILURE); } // fork a child process pid_t pid = fork(); if (pid == -1) { perror("fork failed"); exit(1); } if (pid == 0) // child { child_process(); printf("child exit!\n"); } else // parent { // setting shared 保濕面膜memory sh_mem_t *p = (sh_mem_t*)shared_memory; bzero(p->data, sizeof(p->data)); while (1) { if(fgets(p->data, sizeof(p->data), stdin) == NULL) { printf("Read error\n"); break; } if (strncmp(p->data, 找房子"exit", strlen("exit")) == 0) { break; } } pid_t ret = waitpid(pid, NULL, 0); if (pid != ret) { printf("parent, waitpid failed, %d != %d\r\n", ret, pid); } if (shmdt(shared_memory) == -1) 澎湖民宿{ printf("parent, shmdt failed\r\n"); exit(EXIT_FAILURE); } if (shmctl(shmid, IPC_RMID, 0) == -1) { printf("parent, shmctl failed\r\n"); exit(EXIT_FAILURE); } printf("parent exit!\r\n"); } return EXIT_SUCCESS;}
.msgcontent .wsharing ul li { 房屋出租text-indent: 0; }
分享
Facebook
Plurk
YAHOO!
.msgcontent .wsharing ul li { 房屋出租text-indent: 0; }
分享
Plurk
YAHOO!
全站熱搜
留言列表