Прошу прощения за несколько двусмысленный заголовок, но я действительно не мог придумать более удобный способ его написать.Ошибка сегментации Cline getline (string) в отношении многопоточности
Я разрабатываю оболочку для класса, который, как предполагается, способен обрабатывать фоновые рисунки. Однако, поскольку оболочка не ждет дочерний процесс, когда фоновая настройка включена, я подумал, что было бы лучше создать второй поток, единственной целью которого является очистка дочернего процесса, когда он будет завершен. Теперь это отлично работает, пока не завершится дочерний процесс. Когда дочерний процесс завершается, следующий вход, который я вводил, дает мне ошибку сегментации. Используя gdb, я понял, что ошибка возникает из моей функции getline.
Я протестировал его, и std :: cin, похоже, не проблема. Кроме того, когда не фоновые, все работает отлично, никаких проблем вообще.
Для проверки фона я написал программу a.out, которая печатает, спит в течение десяти секунд, а затем печатает снова перед выходом. Выход:
/Users/opname/Shell Project>./a.out&
/Users/opname/Shell Project>Sleep time!
ls
opshell a.out pseudocode.c test.txt
opshell.cpp a.out.dSYM shell.h test2.txt
opshell.dSYM gcctest.c sleeper.c testdir
/Users/opname/Shell Project>Awake time!
ls
Segmentation fault: 11
Вот код, где я раскошелиться процесс и создать новую тему:
pid_t cpid = fork();
if (cpid > 0) {
int status;
if (conc) { // if backgrounding enabled
pthread_t waiter;
struct tcpara *pm = (struct tcpara*) malloc(sizeof(struct tcpara));
pm->cpid = cpid;
pm->status = &status;
pthread_create(&waiter, NULL, &thread_handler, (void*)pm);
pthread_detach(waiter);
}
else waitpid(cpid, &status, 0);
break;
} else if (cpid == 0) {
loc += cmd;
execv(loc.c_str(), argv);
_exit(0);
}
И вот подпрограмма вызывается официанта нити:
void *thread_handler(void *pm) {
struct tcpara *ofpm = (struct tcpara*) pm;
waitpid(ofpm->cpid, ofpm->status, 0);
free(pm);
return NULL;
}
Позор на меня. Большое спасибо. –