Я не программист линукса, но столкнувшись сегодня с тем же вопросом, я сделал следующий тест:
#include<unistd.h>
#include<signal.h>
#include<errno.h>
#include<fcntl.h>
#include<cassert>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<iostream>
#include<fstream>
#include<sstream>
#include<list>
using namespace std;
int single_talk(int thread_id){
fprintf(stderr,"thread %d before fork @%d\n",thread_id,time(0));
int pid=vfork();
if(-1==pid){
cerr << "failed to fork: " << strerror(errno) << endl;
_exit(-3);//serious problem, can not proceed
}
sleep(1);
fprintf(stderr,"thread %d fork returned %d @%d\n",thread_id,pid,time(0));
if(pid){//"CPP"
fprintf(stderr,"thread %d in parent\n",thread_id);
}else{//"PHP"
sleep(1);
fprintf(stderr,"thread %d in child @%d\n",thread_id,time(0));
if(-1 == execlp("/bin/ls","ls",(char*)NULL)){
cerr << "failed to execl php : " << strerror(errno) << endl;
_exit(-4);//serious problem, can not proceed
}
}
}
void * talker(void * id){
single_talk(*(int*)id);
return NULL;
}
int main(){
signal(SIGPIPE,SIG_IGN);
signal(SIGCHLD,SIG_IGN);
const int thread_count = 44;
pthread_t thread[thread_count];
int thread_id[thread_count];
int err;
for(size_t i=0;i<thread_count;++i){
thread_id[i]=i;
if((err = pthread_create(thread+i,NULL,talker,thread_id+i))){
cerr << "failed to create pthread: " << strerror(err) << endl;
exit(-7);
}
}
for(size_t i=0;i<thread_count;++i){
if((err = pthread_join(thread[i],NULL))){
cerr << "failed to join pthread: " << strerror(err) << endl;
exit(-17);
}
}
}
Я скомпилировал его с g++ -pthread -o repro.cpp
и запустил с ./repro
.
Что я вижу на выходе, так это то, что всё происходит одновременно в раундах: сначала все pthreads запускают vfork, потом все ждут секунду, потом "просыпаются" в дочерней процессной реальности, потом все дети запускают exec(), потом наконец-то просыпаются все родители.
Для меня это доказывает, что если один из pthread'ов вызывает vfork, то он не приостанавливает работу других pthread'ов - если бы это было так, то они не смогли бы вызвать vfork() до тех пор, пока не будет вызвана функция exec().
Для удаления Inkscape и все его настройки делают:
sudo apt-get remove --purge inkscape
Если это не работает, посмотрите в вашу домашнюю папку, показать скрытые файлы, ищите ~ / .Config / Inkscape
Эта папка должна содержать настройки ваших пользователей, чтобы вы могли передавать и / или удалить эти настройки.
Шаблоны, которые использует Inkscape (Debian&co/Linux ), привязаны к вашей локали -и сохраняются в:/usr/share/inkscape/templates/
для общесистемной конфигурации.
. для меня шаблон default.de.svg
должен быть перезаписан как root, так как мне это нужно.