内核上传一个字符串,我在应用层拿到以后对它进行判断,发现明明一样的两个字符串,就是不相等。然后我随手加了一个比较又是ok的,是不是这个指针传的有问题?
如下
130 //接受内核态确认信息
131 ret = recvfrom(skfd, &info, sizeof(struct u_packet_info),0, (struct sockaddr*)&kpeer, &kpeerlen);
132 if(!ret){
133 perror("recv form kerner:");
134 exit(-1);
135 }
136
137 receiveMSG = (HI_CHAR *)info.msg;
138
139 printf("message receive from kernel:%s\n",(HI_CHAR *)info.msg);
140 printf("receiveMSG: %s\n",receiveMSG);
141 //内核和用户进行通信
142
143
144 msgCtrl(receiveMSG);
27 void msgCtrl(HI_CHAR *msg){
28 //mediarevert
29 printf("itachi==>msgCtrl receive : %s\n",msg);
30 HI_CHAR *data = "mediarevert";
31 HI_CHAR *recvmsg;
32
33 recvmsg = msg;
34 printf("recvmsg :%s , len = %d , data's len : %d\n",recvmsg,sizeof(recvmsg),sizeof(data));
35
36 if(0==strcmp(data,recvmsg)){
37 printf("close mediaserver in init.rc!!!\n");
38 property_set("ctl.stop", "media");
39 sleep(10);
40 printf("open mediaserver in init.rc!!!\n");
41 property_set("ctl.start", "media");
42 }else{
43 printf("invalid command-line option\n");
44 }
45
46 char *a = "10";
47 char *b = "10";
48
49 if(0==strcmp(a,b)){
50 printf("a=b\n");
51 }else{
52 printf("a != b\n");
53 }
打印如下:
message sendto kernel are:This message is from itachi's application space, len:64
message receive from kernel:mediarevert
receiveMSG: mediarevert
itachi==>msgCtrl receive : mediarevert
, len = 4 , data's len : 4
invalid command-line option
a=b
楼主,代码中之所以比对失败,可以归纳为以下几点:按照下面修改,应该就ok了。
receiveMSG = (HI_CHAR *)info.msg;
//楼主说的是采用c语言,那么排查c++中的std::string类型,这样info中的msg就是一个字符数组。这里HI_CHAR应该是自定义的char* 类型
printf("message receive from kernel:%s\n",(HI_CHAR *)info.msg);
printf("receiveMSG: %s\n",receiveMSG);
//内核和用户进行通信
msgCtrl(receiveMSG); //指针存放的是字符串的地址,这里最好加上该字符串长度:void msgCtrl(HI_CHAR *msg, int msgLength) //msgCtrl(receiveMSG,strlen(receiveMSG);
void msgCtrl(HI_CHAR *msg){
//mediarevert
printf("itachi==>msgCtrl receive : %s\n",msg);
HI_CHAR *data = "mediarevert";
HI_CHAR *recvmsg; //建议指针变量初始化 HI_CHAR *recvmsg = NULL;
recvmsg = msg; //这里指针赋值是没有问题的。
printf("recvmsg :%s , len = %d , data's len : %d\n",recvmsg,sizeof(recvmsg),sizeof(data)); //sizeof(recvmsg)和sizeof(data)是没有意义的,因为都是指针类型,大小为4字节。&&& 这里没有看到recvmsg的打印信息,是楼主没有复制完全,还是本来就没有打印,
//应修改为:(1)printf("recvmsg :%s , len = %d , data's len : %d\n",recvmsg,strlen(recvmsg),strlen(data));
if(0==strcmp(data,recvmsg)){ //(2)建议改为:if(!strncmp(data,recvmsg,strlen(data)))
将if(0==strcmp(data,recvmsg))改为if(!strncmp(data,recvmsg,strlen(data)))就可以了。如果还不行,直接用参数msg比较看看。如:
if(!strcmp(data,msg))
recvmsg貌似也没什么用,把36行的
if(0==strcmp(data,recvmsg)){
直接改为
if(0==strcmp(data,msg)){
行不行呢?
可以可以。碰见高手了。