请问进程间通讯的问题

发布于 2022-09-30 08:06:21 字数 61 浏览 14 评论 0

请问各位高手“如何在两个进程间传递一个结构、或者指针?“

管道是不是只能传递char型的字符串?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

紧拥背影 2022-10-07 08:06:21

原帖由 conan7205 于 2005-11-25 20:19 发表
请问各位高手“如何在两个进程间传递一个结构、或者指针?“

管道是不是只能传递char型的字符串?

最简单的可以用文件传递.两个程序定义好规则就好了。不过要加锁.
复杂的有消息队列,信号量,共享内存. 也可以socket.

拔了角的鹿 2022-10-07 08:06:21

原帖由 conan7205 于 2005-11-25 20:19 发表
请问各位高手“如何在两个进程间传递一个结构、或者指针?“

管道是不是只能传递char型的字符串?

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. struct t
  5. {
  6.     int a;
  7. };
  8. int main()
  9. {
  10.     int fd[2];
  11.     pid_t pid;
  12.     struct t test;
  13.     if(pipe(fd)<0)
  14.         perror("pipe");
  15.     if((pid=fork())<0)
  16.         perror("fork");
  17.     if(pid==0)
  18.     {
  19.         close(fd[1]);
  20.         read(fd[0],&test,sizeof(struct t));
  21.         printf("%d\n",test.a);
  22.         return 0;
  23.     }
  24.     else
  25.     {
  26.         close(fd[0]);
  27.         test.a=2;
  28.         write(fd[1],&test,sizeof(struct t));
  29.     }
  30.     return 0;
  31. }

复制代码

不知所踪 2022-10-07 08:06:21

关键问题在于不是管道只能传递字符串,而是因为 char 的大小是 1,所以 C 语言使用 char * 指向任何类型的内存地址。应该理解为 BYTE 流。

暮凉 2022-10-07 08:06:21

管道的运行机制是什么?如何刷新?
能不能告知?

淡水深流 2022-10-07 08:06:21

原帖由 沙漠探戈 于 2005-11-26 15:01 发表
管道的运行机制是什么?如何刷新?
能不能告知?

<<Unix环境高级编程>>里讲的就很好.具体你的你可以去参考它.
作为简单的父子进程间通信.或者有名管道作为非父子进程间通信.管道有些原始.不过一直在用.

[ 本帖最后由 mq110 于 2005-11-26 16:08 编辑 ]

命比纸薄 2022-10-07 08:06:21

可以使用消息队列,共享内存,socket等等
如果是在本机上,个人感觉消息队列是最好实现的
消息队列是可以传送一个指定大小的数据结构的
  
具体的可以看看steven的《UNIX网络编程》分1,2两卷
1卷为socket通信,2卷为进程间通信

榕城若虚 2022-10-07 08:06:21

一个共享内存的例子
/***** testwrite.c *******/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
        char name[4];
        int age;
} people;
main(int argc, char** argv)
{
        int shm_id,i;
        key_t key;
        char temp;
        people *p_map;
        char* name = "/dev/shm/myshm2";
        key = ftok(name,0);
        if(key==-1)
                perror("ftok error");
/*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
        shm_id=shmget(key,4096,IPC_CREAT);        
        if(shm_id==-1)
        {
                perror("shmget error");
                return;
        }
/*将这块共享内存区附加到自己的内存段*/
        p_map=(people*)shmat(shm_id,NULL,0);
        temp='a';
        for(i = 0;i<10;i++)
        {
                temp+=1;
                memcpy((*(p_map+i)).name,&temp,1);
                (*(p_map+i)).age=20+i;
        }
/*写数据完毕,将其从自己的内存段中“删除”出去*/
        if(shmdt(p_map)==-1)
                perror(" detach error ");
}

/*读进程首先要得到那块内存块,这个时候,ftok根据文件名和ID创建的key就
很用了,步骤同创建是一样的*/
/********** testread.c ************/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
        char name[4];
        int age;
} people;
main(int argc, char** argv)
{
        int shm_id,i;
        key_t key;
        people *p_map;
        char* name = "/dev/shm/myshm2";
        key = ftok(name,0);
        if(key == -1)
                perror("ftok error");
        shm_id = shmget(key,4096,IPC_CREAT);        
        if(shm_id == -1)
        {
                perror("shmget error");
                return;
        }
        p_map = (people*)shmat(shm_id,NULL,0);
        for(i = 0;i<10;i++)
        {
        printf( "name:%s\n",(*(p_map+i)).name );
        printf( "age %d\n",(*(p_map+i)).age );
        }
        if(shmdt(p_map) == -1)
                perror(" detach error ");
}

岛歌少女 2022-10-07 08:06:21

父子进程间通信可以参考这个帖子

http://bbs.chinaunix.net/forum/v ... ;highlight=wolf0403

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文