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!

arrow
arrow
    全站熱搜

    lb40lbmejl 發表在 痞客邦 留言(0) 人氣()