创建名称管道并在Linux中的C-App和Dlang之间交换结构数据



我正在尝试使用Dlang的Web GUI替换当前的C编码GUI。该应用程序仍然存在,在OpenSuse 12.3 x32平台上,并通过FIFO Pipe与GUI进行通信。

该消息是在C中创建的结构,并在一个单个.H文件中定义了该项目中所有各方的全局访问。

现在解决我的问题,我设法创建了一个管道并写入它,从带有" cat"的终端读取管道的内容,但是当我尝试使用dlang中的pipe handle读取时,我会得到一个大量的? - 召开的信息,可以从管道中读取-1。关于为什么" ?????"的任何想法是我所收到的下面的代码首先是服务器

import std.range, std.stdio, std.conv;
import core.stdc.string;
import core.stdc.stdio;
import core.sys.posix.sys.stat;
import core.sys.posix.unistd;
import core.sys.posix.fcntl;
import core.sys.posix.sys.stat;
//extern (C) uint read(int, void *, uint);
extern (C) uint write(int, void *, ulong);
struct IOREQ {
    short   fc;         /* function code */
    short   rs;         /* return code */
    short   src;        /* return in fifo-pipe */
 };
int fd = -1;
int freader = -1;
char [1024] rbuf = "";

void main(string[] args) {
int st = mknod("/Users/anders/pipes/4321", S_IFIFO|octal!666,0);
close(st);
fd = open("/Users/anders/pipes/4321", O_WRONLY);
//freader = open("/Users/anders/pipes/4321", O_RDONLY);
char [1024]sbuf;
char [1024]rbuf;        
int res = -1;
sbuf =  "Testing a message in pure text to send to client using a FIFO-pipen";
while(1){
    res = write(fd, cast(void *)sbuf, sbuf.sizeof);
    writeln("Wrote data in the pipe, :", res);
    sleep(2);
    sbuf =  "Testing another message in pure text to send to clientn";
}
close(fd);
}

现在客户

import std.range, std.stdio, std.conv;
import core.stdc.string;
import core.stdc.stdio;
import core.sys.posix.sys.stat;
import core.sys.posix.unistd;
import core.sys.posix.fcntl;
import core.sys.posix.sys.stat;
import core.thread;
extern (C) uint read(int, void *, uint);
//extern (C) uint write(int, void *, ulong);
struct IOREQ {
...
 };
int fd = -1;
int freader = -1;
char [1024] rbuf = "";

void main(string[] args) {
//int st = mknode("/Users/anders/pipes/4321", S_FIFO|0666,0);
freader = open("/Users/anders/pipes/4321", O_RDONLY);
//freader = open("/Users/anders/pipes/4321", O_RDONLY);
if(freader < 0)
{
    writeln("Couldn't open pipe ", freader ); 
}
else
{
    char [1024]sbuf;
    char [1024]rbuf;        
    writeln("Reading data from pipeservern");
    int st = read(fd, cast(void *)sbuf, sbuf.sizeof);
    writeln("Done reading, read :", st);
    writeln("Data :n", sbuf);

        close(freader);
    }
}

已经找到了问题,如我们在瑞典所说的。我是从错误的文件/管道读取的,将read Handler纠正读取到Freader而不是FD。还要添加导入core.stdc.errno;Writeln(Errno)给了我Errorno的输出。http://virtsync.com/c-error-codes-include-errno显示它的内容

最新更新