LINUX.ORG.RU

перенправление вывода с JVM

 , ,


0

1

Есть программа-сервер и клиенты. Сервер перенаправляет 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;
}


Последнее исправление: sungmaster (всего исправлений: 1)

проблема была в способе запуска. нужно execl заменить на execlp и задавать параметры отдельно

sungmaster
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.