Мне нужно подключиться от моей функции чтения к моей функции записи. Я тестировал с помощью командной строки ./mapstore retrieve ABCD 2>/dev/null | ./mapstore -p ./new_dir/ stream ABCD
, и это успешно записало данные в канал, а поток успешно прочитал данные из канала и записал их в файловую систему.
Я хотел бы сделать это на C, но у меня проблемы. retrieve_data failed: Undefined error: 0
Я основывал свой код на том, что было в этом выпуске Классический C. Использование каналов в функции execvp, перенаправление stdin и stdout
#include <unistd.h>
#include <stdlib.h>
#include "mapstore.h"
int main(int argc, char *argv[]) {
mapstore_ctx ctx;
if (initialize_mapstore(ctx, NULL) != 0) {
fprintf(stderr, "Error initializing mapstore\n");
return 1;
}
mapstore_ctx new_ctx;
if (initialize_mapstore(&new_ctx, NULL) != 0) {
fprintf(stderr, "Error initializing mapstore\n");
return 1;
}
char *hash = argv[1];
int des_p[2];
if(pipe(des_p) == -1) {
fprintf(stderr, "Failed to create pipe\n");
status = 1;
goto end_restructure;
}
printf("1\n");
if(fork() == 0) {
printf("1a\n");
close(des_p[0]); //closing pipe read
printf("2a\n");
close(des_p[1]);
printf("3a\n");
if ((status = retrieve_data(ctx, des_p[1], hashes[i])) != 0) {
perror("retrieve_data failed");
exit(1);
}
printf("4a\n");
exit(0);
}
if(fork() == 0) {
printf("1b\n");
close(des_p[1]); //closing pipe write
printf("2b\n");
close(des_p[0]);
printf("3b\n");
if ((status = store_data(&new_ctx, des_p[0], hashes[i])) != 0) {
perror("store_data failed");
exit(1);
}
printf("4b\n");
exit(0);
}
printf("2\n");
close(des_p[0]);
printf("3\n");
close(des_p[1]);
printf("4\n");
wait(0);
wait(0);
return 0;
}
Полный код доступен здесь https://github.com/aleitner/libmapstore/blob/master/src/mapstore.c#L374
./src/mapstore restructure Hash: 04a672a6eae704366c44d666890e43ad16bad2b9 retrieve_data failed: Undefined error: 0
, а затем он просто зависает навсегда, пока я не отправлю сигнал для выхода - person Alexander Leitner   schedule 09.12.2017retrieve_data()
вернула 0, аerrno
имеет значение 0. Действительно лиretrieve_data()
возвращает 0 в случае сбоя, или, может быть, вы изменили свою логику? - person John Bollinger   schedule 09.12.2017store_data()
иretrieve_data()
принимает дескриптор файла в качестве аргумента. Если эти функции на самом деле используют их для чтения/записи, то что вы получите, дублируя концы канала на стандартные потоки вместо того, чтобы просто использовать концы канала напрямую? - person John Bollinger   schedule 09.12.2017return status
илиperror()
. - person John Bollinger   schedule 09.12.2017exec
использованием другой программы. Вам это, похоже, не нужно. - person John Bollinger   schedule 09.12.2017Hash: 04a672a6eae704366c44d666890e43ad16bad2b9 1 1a 2 3 4 2a 3a 1b 2b 3b 4a
после 4а приложение зависает - person Alexander Leitner   schedule 09.12.2017store_data()
не возвращается. В моем хрустальном шаре я вижу, какstore_data()
выполняет по крайней мере одно чтение из стандартного ввода вместо указанного файлового дескриптора, но в наши дни это довольно туманно. Больше похоже на снежный шар, правда. - person John Bollinger   schedule 09.12.2017