为什么我的消息传递IPC代码不起作用? (C)

时间:2018-03-08 04:09:07

标签: c linux ipc

我试图编写一个程序来实现父进程和子进程之间的基本消息传递。我在Windows 10的linux子系统上执行此操作。我以前从未使用过C,所以我在过去的两天里一直磕磕绊绊地阅读教程,但我可以&#39似乎让它发挥作用。我能做的最多就是创建没有错误的消息队列。 这是我的代码,评论我对我正在做的事情的最佳理解:

sql(sqlContext, "SELECT df.*, 
                        case when LENGTH(NFE_CNPJ_EMITENTE) in (9,12) then concat('00',NFE_CNPJ_EMITENTE)
                        when LENGTH(NFE_CNPJ_EMITENTE) in (10,13) then concat('0',NFE_CNPJ_EMITENTE)
                        else NFE_CNPJ_EMITENTE end as NFE_CNPJ_EMITENTE_RECODED
                  FROM df")

当我运行时,我会在发送和接收消息时收到失败(返回值<&lt; 0)。我完全迷失在IPC_CREATE意味着什么,IPC_NOWAIT等等。通常是msgsnd和msgrcv中的最后一个参数。在示例中,我看到人们使用0660 | IPC_CREAT,没有解释0660是什么。任何人都可以解释我在我的代码中做错了什么,或者一般来说解释C中的消息传递给那些通常使用C#和Java的人,因为它现在基本上是黑魔法。到目前为止,我发现的每一个资源或教程一旦达到某一点就会超过我的头脑。感谢。

2 个答案:

答案 0 :(得分:0)

  • 关于0660 | IPC_CREATmsgflg的{​​{1}}参数是一组标志,即应在那里设置一些位。 msgget是其中一个位,它的存在指示内核创建消息队列。低9位(在这种情况下为IPC_CREAT)编码队列的权限

    在此示例中,0660是八进制数,编码三个三元组:0660110110。这些三元组中的位表示队列所有者,所有者组成员以及其余成员的读取写入执行权限。世界分别。在这种情况下,允许用户和组读取和写入队列,其余的没有任何权限。

    由于您未指定任何权限(平面000而没有其他内容),因此发送和接收调用将失败并显示IPC_CREAT错误。

  • Permission denied是一个完全不同的野兽。我对windows上的linux知之甚少,但我担心现在你运气不好。请参阅herehere。消息队列尚未实现。

答案 1 :(得分:0)

&#34;功能未实施&#34; (错误代码ENOSYS)表示您的Linux版本已关闭此功能。并不太令人惊讶,因为它被认为是过时的。

您可以重建内核以启用该功能(如果您使用标准内核可能会很痛苦)或使用不同的IPC机制(如管道)。