2012-02-15 16 views
5

मैं लिनक्स पर प्रोग्रामिंग के लिए काफी नया हूं। मैं अपने असाइनमेंट में से एक में एक संदेश कतार लागू करने की कोशिश कर रहा हूं। लेकिन मैं इसे करने में सक्षम नहीं हूं। कोड इस प्रकार है:लिनक्स पर नया से सी प्रोग्रामिंग, टाइपकास्टिंग पर अटक गया

#include <stdio.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <linux/sched.h> 
#include <stdlib.h> 
#include <string.h> 

typedef long MSISDN; 
typedef struct 
{ 
    long mtype; 
    long mtext; 
}msgbuf; 

void init(int qid,int key) { 
    qid = msgget(key,IPC_CREAT|0666); 
} 

void sendMsg(long t_ype, long buf, int len, int qid) { 

    int length = sizeof(long) + sizeof(MSISDN); 
    msgbuf *p = malloc(length); 
    p->mtype = t_ype; 
    fputc('2',stderr); 
    void* tosend = (void*) buff; 
    fputc('3',stderr); 

    memcpy(p->mtext,tosend,length); 

    fputc('4',stderr); 
    msgsnd(qid,p,length,IPC_NOWAIT); 
    free(p); 
} 



void main() 
{ 
    int qid; 
    int key = 1111; 
    int len= sizeof(MSISDN); 
    long type_1=1; 
    long send = 12345; 

    init(qid,key); 
    fputc('1',stderr); 
    sendMsg(type_1,send,len,qid); 

    getchar(); 
} 

समस्या memcpy काम नहीं कर रहा है। मुझे चेतावनी मिल रही है:

। चेतावनी: 'memcpy' के तर्क 1 को पास करने से इंटीजर से पूर्णांक से पॉइंटर बनाता है [डिफ़ॉल्ट रूप से सक्षम]

जब भी मैं कोड चलाता हूं तो यह memcpy पर एक SIGSEGV संकेत प्राप्त करता है। मुझे लगता है कि मुझे टाइपकास्ट सही तरीके से नहीं मिल रहा है।

+2

'memcpy' का तर्क 1 एक प्रतिलिपि है (एक पते पर अधिक सूचक)। कोशिश करें 'और (पी-> mtext) '। [मेम्पी पर मैन पेज] देखें (http://www.kernel.org/doc/man-pages/online/pages/man3/memcpy.3.html)। – Chad

+0

यह संदेश ("* बिना किसी कलाकार के पूर्णांक से पॉइंटर बनाता है *" का मतलब यह नहीं है कि आपको एक कास्ट जोड़ना चाहिए। वास्तव में ** आपको एक कास्ट नहीं जोड़ना चाहिए **, लेकिन इसके बजाय सही पॉइंटर्स प्राप्त करें। – pmg

+0

'buff' कहीं भी परिभाषित नहीं किया गया है ... – sth

उत्तर

5

यह टाइपकास्ट नहीं है, यह तर्क ही है। पी-> mtext एक लंबा, सूचक नहीं है। आपको पता पी-> mtext को dest memcpy के लिए तर्क के रूप में भेजने की आवश्यकता है। आपको segfault मिल रहा है क्योंकि memcpy p-> mtext द्वारा इंगित स्मृति पते पर लिखने का प्रयास कर रहा है, जो आपकी प्रक्रिया 'पता स्थान में स्पष्ट रूप से नहीं है।

यही कारण है - चूंकि यह एक होमवर्क असाइनमेंट है, इसलिए मैं आपको कोड की फिक्सिंग छोड़ दूंगा।

+0

धन्यवाद बहुत सारे लोग ..... अब यह काम कर रहा है ..... :) – anshu

+0

@anshu कभी भी, स्टैक ओवरफ़्लो में आपका स्वागत है; और उस मुद्दे को स्वीकार करना याद रखें जो आपकी समस्या का समाधान करता है। – Chad

संबंधित मुद्दे