首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >msgrcv:无效参数错误

msgrcv:无效参数错误
EN

Stack Overflow用户
提问于 2011-10-03 10:59:08
回答 1查看 4.7K关注 0票数 1

我收到了一个错误,内容是:

msgrcv:无效参数

导致此错误的原因可能是什么?以下是我的代码

最基本的是,我从父级传递消息到子级,然后我想从子级传递消息到父级,即使我对这两个使用了基本上相同的代码,它对第二个接收不起作用。

代码语言:javascript
复制
    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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-03 12:44:05

"Invalid argument“错误来自您的原始进程(不是forked的子进程),并且在它试图从子进程接收回复时发生。出现该错误是因为此时子级已经删除了队列。由于您的原始流程创建了队列并等待该子进程退出,因此删除那里的队列(在接收到回复之后)会更有意义。

即使您解决了这个问题,您仍然会发现当子进程执行msgrcv时,它可能得不到任何东西,因为您的原始进程可能还没有发送它(并且您指定了IPC_NOWAIT)。为了让您的代码正常工作,对于两个接收器,我必须如上所述移动msgctl调用,并在子对象中的msgrcv之前添加一个sleep调用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7630688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档