亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1865 | 回復(fù): 1
打印 上一主題 下一主題

[進(jìn)程管理] 【共享內(nèi)存shmat】關(guān)于使用shmat遇到的詭異問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-10-10 23:19 |只看該作者 |倒序瀏覽
目前在看書的時候看到進(jìn)程間通信共享內(nèi)存的一個例子本來就打算很簡單的去linux上調(diào)試一下,結(jié)果發(fā)生非常讓我難以理解的問題,我已經(jīng)糾結(jié)一個晚上了。
主要問題是:
1、在shmget和shmat函數(shù)都沒有問題,但是在使用shmat得到地址后無法對地址進(jìn)行操作,我是在發(fā)現(xiàn)沒有看到預(yù)期的打印后一步步加打印進(jìn)行調(diào)試的,發(fā)現(xiàn)shmat后對addr無法操作。
2、還有一個問題是同一個父進(jìn)程產(chǎn)生的幾個子進(jìn)程在使用shmat結(jié)果會一樣嗎?我試了幾次結(jié)果都會一樣的。但是看之前有帖子討論貌似會不一樣的。
具體的代碼如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <stdlib.h>
#define SHMKEY                75
int shmid, i;
int *addr;

void CLIENT()
{
        printf("client\n");
        int i = 9;
        shmid = shmget(SHMKEY, 1024, 0777);
        if (-1 == shmid)
        {
                printf("create client key error\n");
        }
        addr = (int *)shmat(shmid, NULL, 0);
        if ((int *)-1 == addr)
        {
                printf("create client addr error\n");
        }
        else
        {
                printf("client addr %p\n", addr);
        }
        for(i = 9; i >= 0; i--)
        {
                printf("client_here1\n");
                while(*addr != -1);
                printf("client_here2\n");
                *addr = i;
                printf("client sent %d\n", *addr);
        }
        printf("out client\n");
        exit(0);
}

void SERVER()
{
        printf("server\n");
        shmid = shmget(SHMKEY, 1024, 0777|IPC_CREAT);
        if (-1 == shmid)
        {
                printf("create server key error\n");
        }
        addr = (int *)shmat(shmid, NULL, 0);
        if ((int *)-1 == addr)
        {
                printf("create server addr error\n");
        }
        else
        {
                printf("server addr %p\n", addr);
        }
        do
        {
                printf("server_here1\n");
                *addr = -1;
                printf("server_here2\n");
                while(*addr == -1);
                printf("server received %d\n", *addr);
        }while(*addr);
        shmctl(shmid, IPC_RMID, 0);//最后一個參數(shù)*buf
        printf("out server\n");
        exit(0);
}
void main()
{
        printf("in\n");
        while((i = fork()) == -1);
        if(!i)        SERVER();
        while((i = fork()) == -1);
        if(!i)        CLIENT();
        wait(NULL);
        wait(NULL);
        printf("out\n");
}


ubuntu 12.04調(diào)試結(jié)果是:
(我一共運行了很多次,截取其中三次)
in
server
server addr 0xfffffffff1d95000
server_here1
client
client addr 0xfffffffff1d95000
client_here1
out
/////////////////////////////////////////////
in
server
server addr 0x1f2c7000
server_here1
client
client addr 0x1f2c7000
client_here1
out
/////////////////////////////////
in
client
client addr 0xffffffff96122000
client_here1
server
server addr 0xffffffff96122000
server_here1
out

跪謝給位大大們的幫助!。

論壇徽章:
0
2 [報告]
發(fā)表于 2016-04-28 23:06 |只看該作者
把你的程序運行了一下,改動三個地方即可:
1. fork的邏輯應(yīng)該調(diào)整成:
                                 if (fork())
                                {
                                        SERVER();
                                }
                                else
                                {
                                        CLIENT();
                                }
    當(dāng)前代碼會嵌套生成過多的進(jìn)程

2. 頭文件需要加上 #include <sys/shm.h>

3. 將SHMID的生成放在main函數(shù)中且在fork之前,這樣就可以同樣被當(dāng)前進(jìn)程和子進(jìn)程同時知道。強制的用75作為SHMKEY并不安全。
實例如下:
          shmid = shmget(IPC_PRIVATE, 1024, S_IRUSR|S_IWUSR);
          if (-1 == shmid)
          {
              printf("create key error\n");
          }

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP