Сообщения Fastman
ести ли софт который может рендерить 3dMax сцены под Unix ?
собственно сабж. Есть ли решение позволяющее скормить 3dMax проект а на выходе получить отрендеренное изображение/видео ?
Вопрос по потокам (pthread)
Ситуация такая, у меня запускаются пару потоков.
В потоке у меня вызывается system("blah");
В другом потоке я проверяю акуально ли выполнение этого
потока и принимаю решение килять его или оставить работать.
Но при килянии потока (pthread_cancel(...)) сам поток
убивается а вот то что было и выполнялось в system
- остается работать.
Как при завершении процесса убить то что я запустил через
system ???Как определить что отвалился клиент от сервера ? (C++/daemon)
#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;
}
Нужно сгененировать сообщение при отваливании клиента.Предложите максимально быстрое сетевое соединение Unix<->Win
Необходимо передавать большие объемы информации между файловым архивом на Win и сервером на Unix, и чем быстрее - тем лучше. Samba - пробовал, медленно. NFS(на Win машине NfsAxe) - быстрее, но не предел мечтаний. Проблем с технической стороны - нет, можно использовать и гигабитную сетку, а можно и Fibre Channel.
Подскажите варианты решения(C++ /system("..."))
сокет сервер принимает от клиента строку типа: /PathTo/script.sh paranm1 param2 выполняем так: int i = system(cmd.c_str()); в script.sh запускается mencoder который берет по сети файл (param1) кодирует в другой формат и ложит по другому сетевому пути (param2) соединение держится до тех пор пока файл не перегонится, и отсылается клиенту сообщение что все тип топ. Вопрос в следующем, кто то выдернул сетевой кабель, либо просто проблемы с сетью, ессно файл не перегнался и mencoder выдал ошибку, как отловить это ???