请问进程间通讯的问题
请问各位高手“如何在两个进程间传递一个结构、或者指针?“
管道是不是只能传递char型的字符串?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
请问各位高手“如何在两个进程间传递一个结构、或者指针?“
管道是不是只能传递char型的字符串?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
最简单的可以用文件传递.两个程序定义好规则就好了。不过要加锁.
复杂的有消息队列,信号量,共享内存. 也可以socket.
复制代码
关键问题在于不是管道只能传递字符串,而是因为 char 的大小是 1,所以 C 语言使用 char * 指向任何类型的内存地址。应该理解为 BYTE 流。
管道的运行机制是什么?如何刷新?
能不能告知?
<<Unix环境高级编程>>里讲的就很好.具体你的你可以去参考它.
作为简单的父子进程间通信.或者有名管道作为非父子进程间通信.管道有些原始.不过一直在用.
[ 本帖最后由 mq110 于 2005-11-26 16:08 编辑 ]
可以使用消息队列,共享内存,socket等等
如果是在本机上,个人感觉消息队列是最好实现的
消息队列是可以传送一个指定大小的数据结构的
具体的可以看看steven的《UNIX网络编程》分1,2两卷
1卷为socket通信,2卷为进程间通信
一个共享内存的例子
/***** 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 ");
}
父子进程间通信可以参考这个帖子
http://bbs.chinaunix.net/forum/v ... ;highlight=wolf0403