LINUX.ORG.RU

[pipe] ftp не хочет общатся через два пайпа

 


0

0

Через два не хочет, а через один - хочет. В общем вот:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *const argv[])
{
	int in[2], out[2], len;
	char buf[80];

	if (pipe(in) != 0 || pipe(out) != 0 )
	{
		perror("pipe");
		return EXIT_FAILURE;
	}

	if (fork() == 0)
	{
		close(0);//
		close(1);

		dup(in[0]);//
		dup(out[1]);

		close(in[1]);
		close(out[0]);

		execlp("ftp", "ftp", "-n", "ftp.mozilla.org", (char *)NULL);
		//execlp("pwd", (char *)NULL);
		perror("execlp");
		return EXIT_FAILURE;
	}

	close(in[0]);
	close(out[1]);

	setvbuf(stdout, NULL, _IONBF, 0);
	while (len = read(out[0], (void *)buf, sizeof(buf)-1), len > 0)
	{
		buf[len] = 0;
		printf("%s", buf);
	}

	close(in[0]);
	close(out[1]);
	return EXIT_SUCCESS;
}
Компилю, пускаю:
gcc main.c && ./a.exe
Но ничего не выводится! Если закомментировать 18 и 21 строчки (в конце них стоит //), вывод от ftp выводится. Если вместо ftp пускать pwd, то вывод есть, даже с двумя пайпами. Думал что это потому что pwd stdin не использует, но от cat вывод тоже выводится, если ему данных послать вот так: write(in[1], «test\n», 5);.

Люди добрые, подскажите, почему так? Как исправить?

Возможен вариант, что в ftp включена буферизация вывода, когда у него на входе не терминал. Это поведение по умолчанию функции printf, http://www.linux.org.ru/view-message.jsp?msgid=3906229 в вашем случае, если вы не делаете "close(0);", то у команды "ftp" stdin является терминалом и буферизации не будет, а если сделать stdin pipe'ом, то по умолчанию printf будет работать с буферизацией. Либо патчить ftp, либо работать с ним через tty.

mky ★★★★★
()
Ответ на: комментарий от Miguel

М-да, палево :) это Cygwin В GNU/Linux то же самое.

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