저는 현재 C로 멀티 스레딩을 연구하고 있습니다. 그러나 우리의 명명 된 파이프를 잘 이해하지 못하는 무언가가 있습니다.
우리는 파일을 찾고 하나의 프로세스로 버퍼에 추가하는 파일 검색 시스템을 구현해야하며 두 번째 프로세스는 첫 번째 스레드에서 파일 이름을 가져 와서 해당 파일 내부에서 검색 쿼리를 찾아 첫 번째 위치로 반환해야합니다 파이프를 통해 처리. 거의 모든 작업을 수행했지만 두 프로세스간에 통신을 수행하는 방법이 혼란 스럽습니다. 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로 변경하십시오. 그런 다음 "오류가있는 파이프를 열 수 없습니다"라는 오류가 표시되므로 어떻게 든 미니언 내부에서 recvPipe를 열 수는 없지만 실수가 무엇인지 알 수는 없습니다.
자세한 답변을 주셔서 감사합니다. 간부의 문제가있는 부분을 이해하게되었습니다. 따라서 익명 파이프 파트의 경우 exec 인수를 통해 파이프를 전달할 수 있습니까? 모든 인수가 char *로 캐스팅 되었기 때문에 가능할 것이라고 생각하지 않았습니다. – BrokenFrog