【发布时间】:2021-04-29 11:54:48
【问题描述】:
我正在尝试实现一个消息队列,并且我已经命名了一个进程服务器和另一个客户端(如您所见,我想坚持使用传统名称)。这是服务器上方的一段代码,您不需要关心它,因为它工作正常。我只是发布它以防它搞砸了整个工作。
我的实际问题是服务器应该如何知道客户端的 pid,因为如果没有使用 ftok 和 pid 作为函数参数的密钥就无法连接?
如果你想自己执行,你需要先运行服务器程序,然后再运行客户端程序(不需要cmd args)。 即使是最轻微的帮助,我也很感激。 提前谢谢大家。
//HEADER FILE NAMED : v1.h
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include <sys/stat.h>
#include<string.h>
#define N 95
#define STRLIM 60
#define PID 25922
#define MSGQ_KEY 1234
#define REQ 1
#define RSP 2
#define REQ_SIZE (sizeof(struct request))
#define RSP_SIZE (sizeof(struct response))
struct request{
long type;
int mqid ;
char* msg;
};
struct response{
long type ;
int res;
char* msg;
};
int estab(char** contact);
int estab(char** contact){
char* test;
test="hi";
int ret;
ret=strcmp(*contact,test);
if(ret<0){
return 1;
}
return 0;
}//end of estab
//SERVER
#include <fcntl.h>
#include"v1.h"
char** cat;
int fd;
int main(int argc, char const *argv[])
{ int i;
int mqid;
struct response rsp;
struct request req;
cat=(char**)malloc(sizeof(char*)*N);
fd=open("dictionary.txt",O_RDONLY);
if(fd==-1){
printf("fd error %d" , fd);
perror("Error:");
}
for(i=0;i<N;i++){
cat[i]=(char*)malloc(sizeof(char)*STRLIM);
read(fd,cat[i],40);
printf("%s", cat[i]);
}
//////////////////end of char ** /////////////////
int pid=getpid();
key_t key=ftok("/home/myName/Desktop/as3/v1/v1s.c",PID);
printf("The key is : %d",key);
mqid=msgget(key,IPC_CREAT|S_IRWXU|IPC_NOWAIT);
int ret=0;
do{
msgrcv(mqid,&req,REQ_SIZE,0,0);
perror("its:");
ret=estab(&req.msg);
}while(ret!=0);
msgsnd(mqid,&rsp,RSP_SIZE,0);
printf("connected");
return 0;}//end of main
#include"v1.h"
int main(int argc, char const *argv[])
{ int mqid,ret,pid;
struct request req;
struct response rsp={0};
req.msg="hi";
pid=getpid();
printf("client's pid : %d",pid);
pid=PID;
mqid=msgget(MSGQ_KEY,0);
msgsnd(mqid,&req,REQ_SIZE,0);
do{
msgrcv(mqid,&rsp,RSP_SIZE,0,0);
ret=estab(&rsp.msg);
}while(ret!=0);
printf("connected from client!");
return 0;
}
【问题讨论】:
-
哪个程序崩溃了,客户端还是服务器?您收到的确切复制/粘贴错误是什么?您是否尝试过在调试器中运行问题程序以便查看崩溃的位置?
-
当问题是“我如何获得PID”时,为什么标题是“消息队列堆栈粉碎”?
-
@Retired Ninja 当然! 检测到堆栈粉碎:终止,中止(核心哑)是确切的错误消息。 Gdb 报告在 .../raise.c:50 收到 SIGABRT 信号,并且该文件丢失。我尝试在遇到此帖子 stackoverflow.com/a/48287761/13052189 时安装所需的库,但我收到了第二步中显示的错误。感谢您的关注。
标签: c linux segmentation-fault message stack-smash