c - msgrcv : Invalid argument Error

标签 c message

我收到一条错误消息:

msgrcv: 无效参数

是什么导致了这个错误?这是我的代码

基本上我是将消息从父级传递给子级,然后我想将消息从子级传递给父级,尽管我对两者使用的代码基本相同,但它不适用于第二次接收。

    struct msg {
        long int    mtype;      /* message type */
        char        mtext[1024];   /* message text */
} msg;
int len, msgflg = 0, msqid, *pint;
pid_t pid;
size_t msgsz = 40;
long int msgtyp;
msqid = msgget(IPC_PRIVATE,S_IRWXU);
char* charpid[250];
msg.mtype = 1;
if (msqid < 0) {
        perror("msgget");
        exit(1);
}

switch(pid=fork()) //fork child process
{
case 0: //Child process 

    //receive message from parent
    if(msgrcv(msqid,&msg,sizeof msg.mtext, 1,IPC_NOWAIT)>=0){
        printf("Serving for client pid #%s",msg.mtext);         
        asprintf(&charpid[0], "%ld\n", pid);
        strncpy(msg.mtext,charpid[0], 1024);

        if(msgsnd(msqid,&msg,strlen(msg.mtext),msgflg)<0){
            perror("msgsnd");       
        }
    }
    else
        perror("msgrcv");

    msgctl(msqid, IPC_RMID, NULL);
    exit(0);

case -1:
    printf("fork failed");
    exit(2);
    break;
default:
    //convert pid to string.
    asprintf(&charpid[0], "%ld\n", pid);
    //set mtext
    strncpy(msg.mtext,charpid[0], 1024);
    //send message

    if(msgsnd(msqid,&msg,strlen(msg.mtext),msgflg)<0){
        //report error
        perror("msgsnd");
    }
    //wait for child process to die
    wait(NULL); 
    //receive message from child
    if(msgrcv(msqid,&msg,sizeof msg.mtext, msg.mtype,IPC_NOWAIT)>=0){
        //print pid
        printf("Received reply from pid #%s",msg.mtext);
    }
    else

        //report error
        perror("msgrcv");   
    exit(0);
}

最佳答案

“无效参数”错误来自您的原始进程(不是 fork 的子进程),并在它尝试接收子进程的回复时发生。发生错误是因为 child 那时已经删除了队列。由于您的原始进程创建了队列并等待 child 退出,因此删除那里的队列(收到回复后)会更有意义。

即使您解决了这个问题,您仍然会发现当 child 执行它的 msgrcv 时它可能什么也得不到,因为您的原始进程可能还没有发送它(并且您指定了 IPC_NOWAIT )。为了使您的代码在两个接收端都能正常工作,我必须移动 msgctl如上所述调用,并添加 sleepmsgrcv 之前调用在 child 身上。

关于c - msgrcv : Invalid argument Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630688/

相关文章:

c - if 语句中只有变量名意味着什么

c - #include 不会加载 C 中的 header

c - 为什么 while 写在这里没有 body ?

java - 在执行下一步操作之前显示消息几分钟

代码解释

c - MPI : getting number of nodes (not processes) in a communicator

java - 使用 java nio 在长传送路径上丢失消息

java - 是否有开源 java 消息流设计器或类似工具?

c - 如何将SIP消息内容传递到C应用程序中

objective-c - iOS 6.0 中的 MessageUI 问题