我目前正在學習C語言的多線程,但有一點我不太明白,我們的命名管道excersize。
我們期望做一個文件搜索系統的實現,該文件搜索系統可以找到文件並用一個進程添加到緩衝區,第二個進程應該從第一個進程的線程獲取文件名,在該文件中找到搜索查詢並返回第一個位置通過管道加工。我做了幾乎所有的事情,但我很困惑如何做兩個進程之間的溝通。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;
}
當我以這種方式運行,線程被阻塞和印刷品沒有任何反應,如果我改爲O_NONBLOCK爲打開模式。然後打印「錯誤打開管道沒有這樣的設備或地址」的錯誤,所以我知道,不知怎的,我無法打開裏面僕從的recvPipe,但我不知道什麼是錯誤
感謝您的詳細解答,讓我明白exec的問題部分。所以對於匿名管道部分,我可以通過exec參數傳遞一個管道。我不認爲這是可能的,因爲所有參數都轉換爲char * – BrokenFrog