当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 很奇怪:在redhat下能出结果,ubuntu就不行
帖子发表于 : 2013-05-11 3:22 

注册: 2013-04-08 17:01
帖子: 31
系统: debian7.0
送出感谢: 2
接收感谢: 0 次
代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define  MSGKEY 75
struct msgform
{   long mtype;
    char mtext[256];
 };

main(int argc,char *argv[])
{ struct msgform msg;
  int msgqid, pid, *pint;

  msgqid = msgget(MSGKEY,0777|IPC_CREAT);
  printf("msgqid = %d\n\n",msgqid);

  pid = getpid();
  pint = (int *)msg.mtext;
  *pint = pid;
  msg.mtype = 1;
  msgsnd(msgqid,&msg,sizeof(int),0);

  msgrcv(msgqid,(struct msgform *)&msg,sizeof(msg),pid,0);
  pint = (int*)msg.mtext;
  pid = (int)*pint;
  printf("Client %s: receive from Server process %d\n",argv[1],pid);
}

代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define  MSGKEY 75
struct msgform
 {  long mtype;
    char mtext[256];
 };
int msgqid;

main()
{ struct msgform msg;
  int i,*pint;
 int pid;
  extern cleanup();
  for (i=0;i<20;i++)
    signal(i,cleanup);
  msgqid = msgget(MSGKEY,0777|IPC_CREAT);
  printf("msgqid = %d\n\n",msgqid); 
  for(;;)
  {
   msgrcv(msgqid,(struct msgform *)&msg,256,1,0);
   pint = (int *)msg.mtext;
   pid = (int)*pint;
   printf("Server : receive from Client process %d \n\n",pid);
   msg.mtype = pid;
   pint = (int *)msg.mtext;
   *pint = getpid();
   msgsnd(msgqid,&msg,sizeof(int),0);
  }
}

cleanup()
 { msgctl(msgqid,IPC_RMID,0);
  exit(0);
 }


代码:
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
main()
{ int  pid1,pid2,pid3;
  pid1 = vfork();
  if (pid1 == 0)
   {  printf("\nClient1 process %4d :\n",getpid());
     execlp("/home/student/client","client","1",NULL);
    }
  else
    { pid2 = vfork();
      if (pid2 == 0)
       {   printf("Client2 process %4d:\n",getpid());
          execlp("/home/student/client","client","2",NULL);
       }
      else
       { pid3 = vfork();
         if (pid3 == 0)
         { printf("Server3 process %4d:\n",getpid());
           execlp("/home/student/server","server",NULL);
         }
         else
           printf("\nThis is Parent process %4d ! \n\n",getpid());
        }
     }
  wait(0);
  wait(0);
  wait(0);
 }


我们操作系统上机写的代码,自己回来在ubuntu下编译可以通过,但是运行的时候显示

Client1 process 18814 :
Client2 process 18815:
msg: cxa_atexit.c:100: __new_exitfn: Assertion `l != ((void *)0)' failed.
Aborted

上机的时候(redhat):

[student@localhost ~]$ ./msg



Client1 process 19083 :

msgqid = 65536



Client2 process 19084:

msgqid = 65536



Server3 process 19085:



This is Parent process 19082 !



msgqid = 65536



Server : receive from Client process 4788



Server : receive from Client process 19083



Client 1: receive from Server process 19085

Server : receive from Client process 19084



Client 2: receive from Server process 19085
这是为什么呢? :em20


_________________
ubuntu12.04不好用,于是我叛逃了。。。


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 很奇怪:在redhat下能出结果,ubuntu就不行
帖子发表于 : 2013-06-24 12:12 
头像

注册: 2012-07-07 10:12
帖子: 111
地址: 广州天河
送出感谢: 0 次
接收感谢: 0 次
我看不懂。
但是这两句,“ execlp("/home/student/client","client","1",NULL);”, execlp("/home/student/server","server",NULL);
说明机房的redhat上有student这个用户,但是,你的ubuntu下有student这个用户吗? :em20


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译