免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cyg19860205
打印 上一主题 下一主题

[C] 消息队列编程问题。。大家帮忙。。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-04-18 18:11 |只看该作者
共享内存块进行message同步,查看内存块变化情况
或者信号集(这个偶不会)。

我不知道您具体要做什么,为什么在终端查看不可以?

论坛徽章:
0
12 [报告]
发表于 2009-04-18 18:22 |只看该作者
还可以用管道,进行message 截获,这个不建议使用(不是常规方法)。
我那个程序只要稍作调整就可以运行呀!
我的运行环境 FreeBSD-6.2

论坛徽章:
0
13 [报告]
发表于 2009-04-18 19:25 |只看该作者

回复 #12 bsd_lite 的帖子

要求是Server端的守护进程守护几个Client端的进程,如果Client端的进程死亡就重启
守护进程与被守护的进程通过消息队列通信

如果两个进程在规定的时间内不在通信了,那么说明进程死亡,就重启

要启动守护进程后,有一个判断的过程(开始被守护进程没有启动时,它们之间是不存在通信的,所以就是Server端守护进程启动并守护Client进程)监视着Client端的进程

论坛徽章:
0
14 [报告]
发表于 2009-04-18 19:30 |只看该作者

回复 #12 bsd_lite 的帖子

FreeBSD-6.2 也是Linux其中的吗?

我用的是ubuntu

论坛徽章:
0
15 [报告]
发表于 2009-04-25 16:16 |只看该作者
大家都不知道吗?

我不知道该怎么样实现了? 郁闷中~~~

帮帮忙哦

论坛徽章:
0
16 [报告]
发表于 2009-04-25 16:34 |只看该作者
原帖由 cyg19860205 于 2009-4-18 10:37 发表
两个进程A、B通过消息队列通信

怎样判断A、B之间是在否通信呢?

要求是Server端的守护进程守护几个Client端的进程,如果Client端的进程死亡就重启
守护进程与被守护的进程通过消息队列通信

如果两个进 ...

按你的意思,守护进程在server端,被守护进程在client端,这两种进程不在一台服务器上,你不能使用消息队列,因为消息队列必须在同一台服务器上进行,你只能使用socket。

我觉得可以这样做:守护进程定时给被守护进程发特定信息,被守护进程收到特定信息后立刻给守护进程回信息,如果守护进程在一定时间内收不到被守护进程的信息则说明被守护进程挂了,则守护进程需要重启被守护进程。但是由于守护进程和被守护进程不在同一台服务器,你需要有另外一个程序(在被守护进程的服务器上)来启动被守护进程,而这个程序应该是后台进程,且必须保持一直运行。但是这时就有问题了:这个程序挂掉了怎么办?

论坛徽章:
0
17 [报告]
发表于 2009-04-25 16:35 |只看该作者
要不用长链接试试看?

[ 本帖最后由 wwdwwd 于 2009-4-25 16:37 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-04-25 17:06 |只看该作者
原帖由 wwdwwd 于 2009-4-25 16:34 发表

我觉得可以这样做:守护进程定时给 ...



不是的,是在同一台机子上运行的几个程序,是我起的名字误导了您

就像您说的那样  在规定的时间内不再通信了 就说明被守护的进程死掉了

可是我现在不知掉怎么判断在规定的时间内不再通信了???

我刚学Linux c编程不久,懂的不多,麻烦您指导一下

谢谢了。。。

[ 本帖最后由 cyg19860205 于 2009-4-25 17:58 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-04-25 21:55 |只看该作者
这个是我以前写的, 你看看

使用shm 作为监视进程, 监视另一个进程运行, 如果被监视进程异常退出, 则重启被监视进程
步骤:
1. 由监视进程启动被监视进程 monitor ./app app_argv_0 app_argv_1, monitor最好是daemon形式
2. app 通过 open-> ftok-> shmget-> shmat 建立shm并写入预定内容
3. monitor 等待 app稳定
4. monitor 通过 ftok-> shmget-> shmat 读取shm 内容并比较, 
   如果app运行正常则清空shm, 重复第四步, 否则跳至第一步




#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>

//===================================

// defined in common.h

typedef struct {
    int magic;
} wd_msg_t;

#define    WD_MSG_FILE_KEY        "/dev/shm/myshm2"
#define    WD_MSG_MAGIC_NUM    0x12348765
#define    WD_MSG_SHM_SIZE        256
//===================================



static void sigint_handler(int sig);
static void shm_wd_uninit(void);
static void exec_app(char* app, char** argv);

static wd_msg_t *p_msg = NULL;
static int shm_id;
static int exit_flg = 0;
static pid_t pid_app = 0;

//monitor ./app app_argv_0 app_argv_1

int main(int argc, char** argv)
{
    key_t key;
    char* name = WD_MSG_FILE_KEY;
    int i;
    char* store_argv[128];
    char* store_app;
    int fd;

    if (argc < 2)
        return 0;

    //store parameter

    store_app = argv[1];
    for (i = 2; i < argc; i++)
    {
        store_argv[i - 2] = argv[i];
    }
    store_argv[i - 2] = NULL;

    // SIGINT

    struct sigaction act, oldact;
    act.sa_handler = sigint_handler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGINT, &act, &oldact);

    // create shm

    fd = open(name, O_RDWR|O_CREAT, S_IRUSR | S_IWUSR);
    if (fd == -1)
        perror("open error");
    key = ftok(name,0);
    if (key==-1)
        perror("ftok error");
    shm_id=shmget(key, WD_MSG_SHM_SIZE ,IPC_CREAT|IPC_EXCL|0666 );
    if (shm_id==-1)
    {
        perror("MONITOR  shmget error");
        return 0;
    }
    p_msg=(wd_msg_t*)shmat(shm_id,NULL,0);
    if ((int)p_msg == -1)
    {
        perror("MONITOR  shmat error");
        return 0;
    }

    exec_app(store_app, store_argv);

    int err_cnt = 0;
    int status;
    while (1)
    {
        if (p_msg->magic == WD_MSG_MAGIC_NUM)
        {
            err_cnt = 0;
            printf("===ok===\n");
            p_msg->magic = 0;
        }
        else
        {
            printf("===error===\n");
            if (++err_cnt >= 3)
            {
                // kill app & restart

                if (pid_app > 0)
                {
                    kill( pid_app,SIGKILL );
                    waitpid( pid_app, &status, WNOHANG );        // obtain information about the child

                }
                exec_app(store_app, store_argv);
            }
        }
        sleep(2);

        if (exit_flg)
            break;
    }
    shm_wd_uninit();

    return 0;
}

static void sigint_handler(int sig)
{
    printf("===end===\n");
    exit_flg = 1;
}

static void shm_wd_uninit(void)
{
    if (shmdt(p_msg)==-1)
        perror("MONITOR   detach error ");
    shmctl( shm_id, IPC_RMID, NULL );
}

static void exec_app(char* app, char** argv)
{
    int status;

    pid_app = fork();
    if (pid_app == -1) /* fork出错 */
    {
        perror("MONITOR   fork error ");
    }
    else if (pid_app == 0) /* fork返回0表示处于子进程 */
    {
        printf("In child process!!\n My PID is %d\n",getpid());
        execv(app, argv);
    }
    else
    {
        puts( "in parent" );
        waitpid( pid_app, &status, WNOHANG );
    }
}


论坛徽章:
0
20 [报告]
发表于 2009-04-25 21:57 |只看该作者
这个是被监视程序

#include <sys/types.h>

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>

//===================================

// defined in common.h

typedef struct {
    int magic;
} wd_msg_t;

#define    WD_MSG_FILE_KEY        "/dev/shm/myshm2"
#define    WD_MSG_MAGIC_NUM    0x12348765
#define    WD_MSG_SHM_SIZE        256
//===================================


// @return    success return shm_id, else return -1

wd_msg_t* shm_wd_init(int *p_shm_id)
{
    wd_msg_t *p_msg;
    int shm_id;
    key_t key;
    char* name = WD_MSG_FILE_KEY;

    key = ftok(name,0);
    if (key==-1)
        perror("ftok error");
    shm_id=shmget(key, WD_MSG_SHM_SIZE ,IPC_CREAT|0666 );        //only get shm

    if (shm_id==-1)
    {
        perror("shmget error");
        return NULL;
    }
    p_msg=(wd_msg_t*)shmat(shm_id,NULL,0);
    if ((int)p_msg == -1)
    {
        perror("shmat error");
        return NULL;
    }
    *p_shm_id = shm_id;
    return p_msg;
}

void shm_wd_send(wd_msg_t* wd_msg)
{
    wd_msg->magic = WD_MSG_MAGIC_NUM;
}


void shm_wd_uninit(wd_msg_t* wd_msg, int shm_id)
{
    if (shmdt(wd_msg)==-1)
        perror(" detach error ");
    shmctl( shm_id, IPC_RMID, NULL );
}

///////////////////////////////////////////////////////////////////////////////////////

int main(int argc, char** argv)
{
    int shm_id;
    wd_msg_t *p_msg = shm_wd_init(&shm_id);

    int i;
    for (i = 0; i < argc; i++)
    {
        printf("app %s\n", argv[i]);
    }

    while (1)
    {

        if (p_msg)
        {
            shm_wd_send(p_msg);
        }
        sleep(1);
        // add code here

    }

    if (p_msg)
    {
        shm_wd_uninit(p_msg, shm_id);
    }

    return 0;
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP