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;
}