Саныч ????
Форум — Talks
собственно сабж. Есть ли решение позволяющее скормить 3dMax проект а на выходе получить отрендеренное изображение/видео ?
Ситуация такая, у меня запускаются пару потоков. В потоке у меня вызывается system("blah"); В другом потоке я проверяю акуально ли выполнение этого потока и принимаю решение килять его или оставить работать. Но при килянии потока (pthread_cancel(...)) сам поток убивается а вот то что было и выполнялось в system - остается работать. Как при завершении процесса убить то что я запустил через system ???
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <syslog.h> #include <signal.h> #include <vector> #include <string> #include <fstream> #include <iostream> using namespace std; class tcpdaemon { protected: void daemonize(); void mainloop(); void operate(int fd); static void sighandler(int signum); public: void exec(); }; void tcpdaemon::sighandler(int signum) { waitpid(0, 0, WNOHANG); } void tcpdaemon::daemonize() { int pid; struct sigaction sa; cout << "Server start ok ! " << flush; pid = fork(); switch(pid) { case 0: setsid(); chdir("/"); close(0); close(1); close(2); memset(&sa, 0, sizeof(sa)); sa.sa_handler = &sighandler; sigaction(SIGCHLD, &sa, 0); openlog("mencoder_server", 0, LOG_USER); mainloop(); closelog(); exit(0); case -1: cout << "fork() error" << endl; break; default: cout << "ok. PID=" << pid << endl; break; } } void tcpdaemon::mainloop() { int sockfd, fd; struct sockaddr_in sa; socklen_t n; sockfd = socket(PF_INET, SOCK_STREAM, 0); if(sockfd != -1) { memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = htons(1667); if(bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) != -1) { while(1) { if(!listen(sockfd, 5)) { n = sizeof(sa); if((fd = accept(sockfd, (struct sockaddr *) &sa, &n)) != -1) { syslog(LOG_NOTICE, "connection from %s", inet_ntoa(sa.sin_addr)); if(!fork()) { operate(fd); } } } } } } } void tcpdaemon::operate(int fd) { char c; bool finished; string cmd, answer; finished = false; write(fd, answer.c_str(), answer.size()); while(!finished) { cmd = answer = ""; while(!finished) { finished = read(fd, &c, 1) != 1; if(c == '\n') break; else if(c != '\r') cmd += c; } if(!finished && !cmd.empty()) { if(cmd == "info") { answer = "SERVER"; } else if(cmd == "version") { answer = "version 1.0"; } else if(cmd == "quit") { shutdown(fd, 2); close(fd); finished = true; } else { int i = system(cmd.c_str()); if(i == -1) { answer = "ierr"; } else if (i !=0 ) { answer = "fld"; } else answer = "ok"; } } if(!finished && !answer.empty()) { answer += "\n"; write(fd, answer.c_str(), answer.size()); } } exit(0); } void tcpdaemon::exec() { daemonize(); } int main() { tcpdaemon d; d.exec(); return 0; } Нужно сгененировать сообщение при отваливании клиента.
Необходимо передавать большие объемы информации между файловым архивом на Win и сервером на Unix, и чем быстрее - тем лучше. Samba - пробовал, медленно. NFS(на Win машине NfsAxe) - быстрее, но не предел мечтаний. Проблем с технической стороны - нет, можно использовать и гигабитную сетку, а можно и Fibre Channel.
сокет сервер принимает от клиента строку типа: /PathTo/script.sh paranm1 param2 выполняем так: int i = system(cmd.c_str()); в script.sh запускается mencoder который берет по сети файл (param1) кодирует в другой формат и ложит по другому сетевому пути (param2) соединение держится до тех пор пока файл не перегонится, и отсылается клиенту сообщение что все тип топ. Вопрос в следующем, кто то выдернул сетевой кабель, либо просто проблемы с сетью, ессно файл не перегнался и mencoder выдал ошибку, как отловить это ???