Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-通过管道发送结构数组_C_Arrays_Struct_Pipe - Fatal编程技术网

C-通过管道发送结构数组

C-通过管道发送结构数组,c,arrays,struct,pipe,C,Arrays,Struct,Pipe,我正试图通过管道发送结构数组。我有一个结构: typedef struct visitordata { char name[80]; char email[80]; int id; char reg_time[9]; }visitordata; 那我会的 //... //ds is the number of struct entries to be stored visitordata* V; V = (visitordata*)malloc(ds * siz

我正试图通过管道发送结构数组。我有一个结构:

typedef struct visitordata {
    char name[80];
    char email[80];
    int id;
    char reg_time[9];
}visitordata;
那我会的

//...
//ds is the number of struct entries to be stored
visitordata* V;
V = (visitordata*)malloc(ds * sizeof(visitordata));

pid_t child = fork();
if(child < 0) {
    perror("Fork error");
        exit(1);
    }
 else if (child > 0) { //parent process
    write(pipefd[1], &V, sizeof(V));
    close(pipefd[1]);
    fflush(NULL);
    pause();

    sleep(1);
    pause();
    kill(child,SIGTERM);                
    waitpid(child, &status, 0);
}
else { //child process
    visitordata* data;
    close(pipefd[1]);

    read(pipefd[0], &data, sizeof(data));
    close(pipefd[0]);
    flush(NULL);
    for (i = 0; i < ds; ++i) {
        printf("Received: %s\r\n", data[i].name);
    }

    kill(getppid(), SIGUSR1);
    pause();                
}
现在我的输出是这样的:

Received: 0▒:▒0▒:▒ 
Received:
size_t bytesToWrite = ds * sizeof(visitordata);
size_t totalWritten = 0;

for ( ;; )
{
    ssize_t bytesWritten = write( pipefd[1], V + totalWritten,
        bytesToWrite - totalWritten );
    if ( bytesWritten <= 0 )
    {
        break;
    }

    totalWritten += bytesWritten;
}
编辑2

更新

read(pipefd[0], data, ds * sizeof(data));

现在我的输出是:

Received: 0Tɢ0Tɢ
Received:

您将不正确的参数传递给
写入
读取
。您需要传递一个指向实际数据的指针,以及以字节为单位的数据长度

因此:

应该是:

write(pipefd[1], V, ds * sizeof(visitordata)); // note: 2 fixes here
read(pipefd[0], data, ds * sizeof(visitordata)); // note: 2 fixes here also
同样地:

read(pipefd[0], &data, sizeof(data));
应该是:

write(pipefd[1], V, ds * sizeof(visitordata)); // note: 2 fixes here
read(pipefd[0], data, ds * sizeof(visitordata)); // note: 2 fixes here also

另外,正如所指出的,您的
数据
指针没有初始化(它只是一个野生指针)。更改:

致:

这气味:

写入(pipefd[1],&V,sizeof(V))

也许这样更好:

写入(pipefd[1],V,sizeof(V))

接收部分也有问题。在哪里为它分配缓冲区? visitordata*数据

read()
write()
读取和写入最大为请求的字节数。根据:

write()
函数将尝试从
buf
指向与打开文件关联的文件的缓冲区 文件描述符,
fildes

返回值

成功完成后,这些函数应返回实际写入与
fildes
相关文件的字节数。该数字不得大于
nbyte
。否则,应返回-1,并设置errno以指示错误

你的代码从不检查写的结果——你只希望它能工作。 要确保写入请求的全部字节数,您需要以下内容:

Received: 0▒:▒0▒:▒ 
Received:
size_t bytesToWrite = ds * sizeof(visitordata);
size_t totalWritten = 0;

for ( ;; )
{
    ssize_t bytesWritten = write( pipefd[1], V + totalWritten,
        bytesToWrite - totalWritten );
    if ( bytesWritten <= 0 )
    {
        break;
    }

    totalWritten += bytesWritten;
}
size\u t bytesToWrite=ds*sizeof(visitordata);
大小\u t totalwrited=0;
对于(;;)
{
ssize_t bytesWrite=写入(pipefd[1],V+totalwrited,
bytesToWrite-TotalWrite);

如果(bytesWrited),则在
write
read
调用中不应使用
sizeof
。您正在读取和写入指针中的字节数(例如4或8)-您需要传递数据的实际长度。您能解释一下吗?我很快会添加一个答案。您实际上不是在数组中写入和读取数据,而是在写入和读取一个指向数据的指针。只有在分配内存并在子进程之前对其进行初始化时,这才有效。@lte\uuuuuux:您没有“没有正确更新代码,例如,查看对
写入
读取
的调用,并将它们与下面我的答案中的固定版本进行比较。好的,现在我更新了这个,但它仍然不能完美地工作。我将在一分钟内编辑这个问题。噢,抱歉,我会解决它!我的输出仍然是内存垃圾:/@lte\uuuuuuu您在
read()
以了解您的代码实际上在做什么。是的,我也是为读取端做的。我会尝试以某种方式调试它。如果我只是通过管道发送一个字符串,它就会工作。也许我只需迭代它并发送字符串…@lte\uuuu您应该能够发送整个结构数组。
visitordata* data;
visitordata* data = malloc(ds * sizeof(visitordata));
size_t bytesToWrite = ds * sizeof(visitordata);
size_t totalWritten = 0;

for ( ;; )
{
    ssize_t bytesWritten = write( pipefd[1], V + totalWritten,
        bytesToWrite - totalWritten );
    if ( bytesWritten <= 0 )
    {
        break;
    }

    totalWritten += bytesWritten;
}