私は現在Cでマルチスレッドを研究していますが、私たちの名前付きパイプではわかりにくいものがあります。
ファイルを検索して1つのプロセスでバッファに追加するファイル検索システムを実装することが期待されています.2番目のプロセスは最初のスレッドからファイル名を取り、そのファイル内の検索クエリを見つけ出し、パイプを介して処理する。私はほとんどすべてをしましたが、私は2つのプロセス間の通信をどうやって行うのか混乱しています。 C fifoはブロックされ続けます
main.cの
void *controller_thread(void *arg) {
pthread_mutex_lock(&index_mutex);
int index = t_index++; /*Get an index to thread*/
pthread_mutex_unlock(&index_mutex);
char sendPipe[10];
char recvPipe[10];
int fdsend, fdrecv;
sprintf(sendPipe, "contrl%d", (index+1));
sprintf(recvPipe, "minion%d", (index+1));
mkfifo(sendPipe, 0666);
execlp("minion", "minion", sendPipe, recvPipe, (char*) NULL);
if((fdsend = open(sendPipe, O_WRONLY|O_CREAT)) < 0)
perror("Error opening pipe");
if((fdrecv = open(recvPipe, O_RDONLY)) < 0)
perror("Error opening pipe");
while(1) {
char *fileName = pop(); /*Counting semaphore from buffer*/
if(notFile(fileName))
break;
write(fdsend, fileName, strlen(fileName));
write(fdsend, search, strlen(search));
char place[10];
while(1) {
read(fdrecv, place, 10);
if(notPlace(place)) /*Only checks if all numeric*/
break;
printf("Minion %d searching %s in %s, found at %s\n", index,
search, fileName, place);
}
}
}
、私はこれがメインの内部FIFOを処理するための方法だと思います。私はここにある、ちょうどそれが動作することを確認するためのテスト手先を書き込もうとしました
minion.c
int main(int argc, char **argv) {
char *recvPipe = argv[1];
char *sendPipe = argv[2];
char fileName[100];
int fdsend, fdrecv;
return 0;
fdrecv = open(recvPipe, O_RDONLY);
mkfifo(sendPipe, 0666);
fdsend = open(sendPipe, O_WRONLY|O_CREAT);
while(1) {
read(fdrecv, fileName, 100);
write(fdsend, "12345", 6);
write(fds, "xxx", 4);
}
return 0;
}
私はこの方法を実行すると、スレッドは印刷物応答がない場合はブロックされますIオープンモードにO_NONBLOCKに変更してください。それから、「エラーが発生しました」というエラーが表示されるので、何とかrecipPipeをminion内で開くことができませんでしたが、何が間違っているのか分かりません。
詳細な回答をいただきありがとうございます。私はexecの問題のある部分を理解できました。したがって、匿名のパイプ部分では、exec引数でパイプを渡すことはできますか?私はすべての引数がchar *にキャストされているので、それが可能であるとは思わなかった* – BrokenFrog