C: 管道:如何正确使用管道传递动态 int 数组
C: Pipe: How to pass a dynamic int array using pipe correctly
我尝试在几个子进程中编写动态分配的 int 数组,并使用管道在父进程中读取它们,但结果类似于 [-15236548, 37526, -15236548, 37526,0,0,0, 0,0,0],看起来读取的是地址而不是实际值 [1,1,1,1,0,2,1,1,1,1]。我真的为此苦苦挣扎了一整天,任何帮助将不胜感激!!!
子进程有10个,先各自写入一个数组,全部写完后,父进程读取10个数组。
int *getArr(){
int * arr1 = malloc(sizeof(int) *100);
//do something
return arr1;
}
//write values to pipe
void write_check(int fd, void *buffer, size_t len){
char *p = buffer;
while(len>0){
size_t wlen = write(fd, p, len);
if(wlen <= 0)
exit(0);
p += wlen;
len -= wlen;
}
}
// read values from pipe
void read_check(int fd, void *buffer, size_t len){
char *p = buffer;
while(len>0){
size_t rlen = read(fd, p, len);
if(rlen <= 0)
exit(0);
p += rlen;
len -= rlen;
}
}
// pass values, and get it ready to be wrote
void write_ints(int fd, int *p, int len){
write_check(fd, p, len * sizeof(*p));
}
// allocate memory for fetching values
void read_ints(int fd, int *p, int len){
p = malloc(len * sizeof(*p));
read_check(fd, p, len* sizeof(*p));
}
int main(){
int len = 100;
int *arr1 = malloc(sizeof(int) * 100);
int *fds = malloc(sizeof(int) * 10 * 2);
// child processes write values to pipe
for(int i=0; i<10; i++){
child_pid = fork();
if (child_pid == 0){
// do something
arr1 = getArr();
write_ints(fd[i*2+1], &arr1, len);
}
}
// parent process reads values
for(int i=0; i<10; i++){
// do something
read_ints(fd[i*2], &arr1, len);
}
}
预期为 int * 但参数为 int ** 错误是由于传递 &arr1 造成的。指针的地址是双 pointer.just pass arr1(在 write_ints 和 read_ints 中)你不会得到那个错误。
void read_ints(int fd, int *p, int len){
p = malloc(len * sizeof(*p));
read_check(fd, p, len* sizeof(*p));
}
此功能无法使用。你传递给它一个指针,它会忽略它。然后它分配一些内存,将一些整数读入该内存,并且对指向该内存的指针不做任何事情,使调用者无法访问读取的值。
如果这个函数要分配内存,它需要return一个指向它分配的内存的指针。如果这个函数要接收一个指向它要将整数读入的内存的指针,那么它应该将整数读入提供的缓冲区而不是分配它自己的缓冲区。
如果有注释,您的代码将更容易调试。看着这个函数,我不知道它应该做什么,而且我在代码中看到了相互矛盾的信息。是应该分配一个缓冲区来读入整数,还是应该提供一个指向要读入的缓冲区的指针?评论会清除它。
您还不能指望您的代码来记录您的意图,因为您的代码还不够好,无法做到这一点。所以你需要使用评论,这样其他人才能知道你想做什么,而不仅仅是你实际做了什么。
我尝试在几个子进程中编写动态分配的 int 数组,并使用管道在父进程中读取它们,但结果类似于 [-15236548, 37526, -15236548, 37526,0,0,0, 0,0,0],看起来读取的是地址而不是实际值 [1,1,1,1,0,2,1,1,1,1]。我真的为此苦苦挣扎了一整天,任何帮助将不胜感激!!!
子进程有10个,先各自写入一个数组,全部写完后,父进程读取10个数组。
int *getArr(){
int * arr1 = malloc(sizeof(int) *100);
//do something
return arr1;
}
//write values to pipe
void write_check(int fd, void *buffer, size_t len){
char *p = buffer;
while(len>0){
size_t wlen = write(fd, p, len);
if(wlen <= 0)
exit(0);
p += wlen;
len -= wlen;
}
}
// read values from pipe
void read_check(int fd, void *buffer, size_t len){
char *p = buffer;
while(len>0){
size_t rlen = read(fd, p, len);
if(rlen <= 0)
exit(0);
p += rlen;
len -= rlen;
}
}
// pass values, and get it ready to be wrote
void write_ints(int fd, int *p, int len){
write_check(fd, p, len * sizeof(*p));
}
// allocate memory for fetching values
void read_ints(int fd, int *p, int len){
p = malloc(len * sizeof(*p));
read_check(fd, p, len* sizeof(*p));
}
int main(){
int len = 100;
int *arr1 = malloc(sizeof(int) * 100);
int *fds = malloc(sizeof(int) * 10 * 2);
// child processes write values to pipe
for(int i=0; i<10; i++){
child_pid = fork();
if (child_pid == 0){
// do something
arr1 = getArr();
write_ints(fd[i*2+1], &arr1, len);
}
}
// parent process reads values
for(int i=0; i<10; i++){
// do something
read_ints(fd[i*2], &arr1, len);
}
}
预期为 int * 但参数为 int ** 错误是由于传递 &arr1 造成的。指针的地址是双 pointer.just pass arr1(在 write_ints 和 read_ints 中)你不会得到那个错误。
void read_ints(int fd, int *p, int len){
p = malloc(len * sizeof(*p));
read_check(fd, p, len* sizeof(*p));
}
此功能无法使用。你传递给它一个指针,它会忽略它。然后它分配一些内存,将一些整数读入该内存,并且对指向该内存的指针不做任何事情,使调用者无法访问读取的值。
如果这个函数要分配内存,它需要return一个指向它分配的内存的指针。如果这个函数要接收一个指向它要将整数读入的内存的指针,那么它应该将整数读入提供的缓冲区而不是分配它自己的缓冲区。
如果有注释,您的代码将更容易调试。看着这个函数,我不知道它应该做什么,而且我在代码中看到了相互矛盾的信息。是应该分配一个缓冲区来读入整数,还是应该提供一个指向要读入的缓冲区的指针?评论会清除它。
您还不能指望您的代码来记录您的意图,因为您的代码还不够好,无法做到这一点。所以你需要使用评论,这样其他人才能知道你想做什么,而不仅仅是你实际做了什么。