2017-09-26 19 views
3

퓨즈 파일 시스템을 개발 중이며 fuse_main_real()을 호출하기 전에 클래스 인스턴스에서 std::thread을 시작하여 배경 작업을 수행합니다.응용 프로그램에 백그라운드가 있으면 스레드가 종료됩니까?

this->t_receive = new std::thread([this] { this->receive(); }); 

그러나 배경으로 들어가면 fuse_main_real()은이 스레드를 죽입니다.
fuse가 포 그라운드에 있다고 알려주는 -f 옵션으로 프로그램을 시작하면 문제가 발생하지 않고 스레드가 남아 있습니다.

퓨즈가 배경으로 들어가는 것은 확실하지 않습니다.

내 스레드가 백그라운드에서 살아남도록하려면 어떻게해야합니까?


편집 :

./test.o -f /home/test/testmountpoint 
: (반복 "테스트"라는) 작동

g++ -D_FILE_OFFSET_BITS=64 `pkg-config --cflags fuse` -lfuse -lpthread -std=c++14 -o test.o test.cpp 

명령과

#define FUSE_USE_VERSION 30 

#include <iostream> 
#include <thread> 

#include <fuse.h> 

static void thread_method() 
{ 
     while (true) 
     { 
       std::cout << "test" << std::endl; 
       std::this_thread::sleep_for(std::chrono::seconds(1)); 
     } 
} 

struct testop : fuse_operations 
{ }; 

static struct testop ops; 

int main(int argc, char** argv) 
{ 
     std::thread(thread_method).detach(); 
     fuse_main_real(argc, argv, &ops, sizeof(fuse_operations), NULL); 
} 

컴파일 : 여기에 문제를 노출하는 기본 예제

작동하지 않고 명령을 보여주는 명령 그는 문제 (라고 한 번 "테스트") :

./test.o /home/test/testmountpoint 
+1

그 질문은 불완전한 것처럼 보입니다 ... – Phil1970

+0

관련 없음 : 왜 동적으로'스레드 '를 할당합니까? 이상하고 무모한 선택 인 것 같습니다. – user4581301

+1

나는 퓨즈가 "포크와 출구"를 사용하여 데몬 화한다고 추측하고 있습니다. 이로 인해 새 백그라운드 프로세스가 생성되고 원래의 주 프로세스가 스레드와 함께 종료됩니다. 포크가 발생한 후에 자식 프로세스에 필요한 스레드를 만드는 것이 이상적입니다. 불행히도 나는 이것을 수행하는 방법을 알기 위해 퓨즈 내부에 대해 충분히 알지 못합니다. – msandiford

답변

2

libfuse wiki

기타 스레드가 초기화() 메소드에서 시작되어야한다고 말한다. 프로세스가 백그라운드로 들어갈 때 fuse_main()이 종료되기 전에 시작된 스레드.