Элементарный однопанельный «файлменеджер» делается довольно просто (я даже на баше делал, потом — на сях; на стороне клиента JS).
Но вот двухпанельник сделать невозможно из-за ограничений, накладываемых разработчиками браузеров на формы отправления файлов из соображений безопасности. Даже просто отобразить файлы из локальной директории невозможно (из тех же соображений безопасности). Для загрузки файлов на сервер остается всего лишь формочка загрузки нескольких файлов, причем если файлы не лежат в одной директории, придется добавлять новую формочку и т.д.
Достаточно просто сначала думать, а потом делать, а не наоборот.
Можно ведь и из-под рута знаменитый однострочник на perl выполнить, а потом долго себя проклинать.
Создайте несколько функций-обработчиков, выводящих разный текст, назначайте каждому потоку свою функцию.
Точно так же можно сделать несколько обработчиков (или один, чье поведение зависит от глобальной переменной, которую вы будете модифицировать перед вызовом signal(...) ) и назначать их на нужный сигнал в начале критической секции, а в ее конце сбрасывать на обработчик по умолчанию.
Как? Как только вы в обработчике назначите signal(SIGSEGV, SIG_DFL) или signal(SIGSEGV, SIG_IGN), программа завершится. Если вы этого делать не будете, обработчик будет вызываться бесконечно.
Нет, читал лишь мануал.
mercurial мне понравился тем, что там минимум телодвижений: hg commit, hg push, hg pull, hg clone — вот и все, что я использую.
Какой смысл вообще обрабатывать сегфолт? Мы же все равно не сможем понять, где он произошел. Разве что включать обработку SIGSEGV в критических областях (чтобы знать, что сегфолт был там).
Ну так от facebook'а-то украинские федералы вряд ли какой информации дождутся, а так — все досье в одном месте. Удобно же. Не одной же России «вконтактегом» работу федералов упрощать, вот на Украине тоже поняли, как можно меньше двигаться и лучше «раскрывать».
Но вот двухпанельник сделать невозможно из-за ограничений, накладываемых разработчиками браузеров на формы отправления файлов из соображений безопасности. Даже просто отобразить файлы из локальной директории невозможно (из тех же соображений безопасности). Для загрузки файлов на сервер остается всего лишь формочка загрузки нескольких файлов, причем если файлы не лежат в одной директории, придется добавлять новую формочку и т.д.
Так ведь некоторые вещи «простому смертному» делать недозволено. А от рута можно (в т.ч. и ping с нестандартными параметрами запускать и т.п.).
Можно ведь и из-под рута знаменитый однострочник на perl выполнить, а потом долго себя проклинать.
Так что, не годится этот способ.
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
void memento(int a){
printf(«Ooops segfault in thread %d\n», a);
signal(SIGSEGV, SIG_DFL);
}
void _1(int a){memento(1);}
void _2(int a){memento(2);}
void _3(int a){memento(3);}
void _4(int a){memento(4);}
void *fall(void *arg){
signal(SIGSEGV, arg);
int* p = 0;
p[5] = 13;
printf(«p=%d\n», p[5]);
signal(SIGSEGV, SIG_DFL);
}
void *not_fall(void *arg){
signal(SIGSEGV, arg);
int n = 0;
printf(«n=%d\n», n);
signal(SIGSEGV, SIG_DFL);
}
int main(int argc, char *argv[]){
pthread_t threads[4]; int i;
pthread_create(&threads[1], NULL, fall, _1);
pthread_create(&threads[2], NULL, not_fall, _2);
pthread_create(&threads[3], NULL, not_fall, _3);
pthread_create(&threads[4], NULL, fall, _4);
for(i=0; i<4; i++) pthread_join(threads[i], NULL);
}
Выхлоп:
gcc -lpthread 1.c && ./a.out
n=0
Ooops segfault in thread 1
n=0
Ooops segfault in thread 4
Ошибка сегментирования
Точно так же можно сделать несколько обработчиков (или один, чье поведение зависит от глобальной переменной, которую вы будете модифицировать перед вызовом signal(...) ) и назначать их на нужный сигнал в начале критической секции, а в ее конце сбрасывать на обработчик по умолчанию.
#include
#include
#include
int memento(){
int a=0;
printf(«Ooops\n»);
return 0;
}
void fall(){
int* p = 0;
p[5] = 13;
printf(«p=%d\n», p[5]);
}
void posix_death_signal(int signum){
memento();
signal(signum, SIG_DFL);
}
int main(int argc, char *argv[]){
signal(SIGSEGV, posix_death_signal);
fall();
}
вот такой вывод:
gcc 1.c && ./a.out
Ooops
Ошибка сегментирования
А для файла без обработчика:
#include
void fall(){
int* p = 0;
p[5] = 13;
printf(«p=%d\n», p[5]);
}
int main(int argc, char *argv[]){
fall();
}
вот такой вывод:
gcc 2.c && ./a.out
Ошибка сегментирования
mercurial мне понравился тем, что там минимум телодвижений: hg commit, hg push, hg pull, hg clone — вот и все, что я использую.
// сколько же ЛОРовцев здесь :)