Есть программа-сервер и клиенты. Сервер перенаправляет stdin/out клиентов в каналы и запускает бинарник/java апплет. С бинарниками проблем нет, а вот с java проблема. Перенаправление stdin работает хорошо, а stdout работает странно: при первом же вызове poll возвращает POLLHUP. Вызов апплета делаю через java -Xmx100m -cp ./dir class
Вот мой код
int launchPlayer(char *cmdline, connectInfo *user){
if (pipe(user->rPipe) || pipe(user->wPipe)){
return 0;
}
//printf("%s\n", cmdline);
int pid = fork();
if (pid < 0){ return 0; }
else if (pid == 0){
//child
int size = 41943040;
if (cmdline[0]=='j'){
size = 268435456;
}
struct rlimit rl = { .rlim_cur = size, .rlim_max = size };
setrlimit(RLIMIT_AS, &rl);
struct rlimit rl2 = { .rlim_cur = 0, .rlim_max = 0 };
setrlimit(RLIMIT_NPROC, &rl);
struct rlimit rl3 = { .rlim_cur = 3, .rlim_max = 3 };
setrlimit(RLIMIT_NOFILE, &rl);
dup2(user->wPipe[READ], 0);
dup2(user->rPipe[WRITE], 1);
dup2(user->rPipe[WRITE], 2);
close(user->rPipe[READ]); close(user->wPipe[WRITE]);
close(user->wPipe[READ]); close(user->rPipe[WRITE]);
execl(cmdline, (char*)NULL);
exit(errno);
}
else{
//parent
close(user->wPipe[READ]); close(user->rPipe[WRITE]);
user->processInfo = pid;
user->stdoutReadHandle = user->rPipe[READ];
user->stdinWriteHandle = user->wPipe[WRITE];
}
return 1;
}
int peekPipe(int pipe){
struct pollfd y;
y.fd=pipe; y.events=POLLIN;
int x = poll(&y, 1, 0);
struct timespec tim, tim2;
tim.tv_sec = 0;
tim.tv_nsec = 10000000L;
nanosleep(&tim, &tim2);
return x;
}
int readPipe(int pipe, char* buffer){
int x = read(pipe, buffer, 1024);
if (x>=0){buffer[x]='\0';}
return x;
}