Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » нестандартный output

Ответить
Настройки темы
нестандартный output

Аватара для Guest

Guest



Профиль | Цитировать


Хочу сделать так:с помощью функции popen() открыть /bin/bash на запись,записать туда допустим "uname -r " но вывод uname -r произвести не на stdout ,а на другой ф.дескриптор с помощью dup2():
printf(">>>> Opening stream popen <<<<\n";
FILE *fp,*lp;
lp=fopen("output","w+";
char ch[20];
fp=popen("/bin/bash","w";
printf("Enter command\n";
scanf("%s",&ch);
dup2(0,lp);
dup2(1,lp);
fprintf(fp,"%s",ch);
pclose(fp);
Но все равно выводится на экран а не в файл output!


*

Отправлено: 16:21, 28-05-2004

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Если я правильно понял логику Вашей программы, то ошибка в том, что dup2 вызывается после popen. Поскольку popen по сути fork, дескрипторы будут унаследованы нормальные (на stdout), а не переопределенные (в файл). И зачем Вы перенаправляете stdin (id=0)? Наверное, надо 1 и 2.

Отправлено: 15:12, 03-06-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Guest

Guest


Профиль | Цитировать


Я последовал вашему совету,но результат тот же!
Даже не работает такой код:
FILE *fp;
fp=fopen("output","w";
dup2(1,fp)
dup2(2,fp);

printf("HEllo";
почему так?Все равно на экран выводит!

Отправлено: 16:51, 03-06-2004 | #3


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Неправильно указаны аргументы у dup2
Код: Выделить весь код
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
 
int main (void) 
{ 
  int fd = open("out.txt", O_CREAT | O_APPEND | O_WRONLY); 
  dup2(fd, 1); 
  printf("hello\n"); 
  close(fd); 
  return 0; 
}
Обратите внимание, что в примере я работаю с open, потому что dup2 работает с дескрипторами, а не FILE*

Отправлено: 10:11, 04-06-2004 | #4


Аватара для Guest

Guest


Профиль | Цитировать


Вроде работает!
Скорее всего из-за dup2() - но ведь в мане сказано что первый параметр - это старый дескриптор,а второй - новый,на который надо все перенаправлять!
И лучше использовать int lp=open()?

Отправлено: 12:34, 04-06-2004 | #5


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


В мане немного по-дургому написано. dup2  делает  newfd  копией  oldfd,  закрывая newfd, если это необходимо. Недопонимание возникает, если не знать, как работает просто dup(), а не dup2(). Так исторически сложилось...
Насчёт open и fopen - трудно сказть, что лучше. open универсальнее, но с ней немного труднее работать.

Отправлено: 13:21, 04-06-2004 | #6


Аватара для Guest

Guest


Профиль | Цитировать


Теперь у меня такая трабла:Я хочу ессно это с сетью связать,т.е типа telnet'a
сделать:
Сервак:
#define PORT1 1234
#define PORT2 4321
int main (void) {
int acc;
char buf[64];
int from_len;
FILE *fp;
fp=popen("/bin/sh","w";//открываем /bin/sh
      struct sockaddr_in serv,client;
int s;
s=socket(AF_INET,SOCK_STREAM,0);


serv.sin_family=AF_INET;
serv.sin_addr.s_addr=INADDR_ANY;
serv.sin_port=htons(PORT1);
bind(s,&serv,sizeof(serv));
int lis=listen(s,10);

while(1) {
       from_len=sizeof(client);
acc=accept(s,&client,sizeof(client));//принимаем коннект
dup2(acc,1);//перенаправляем i/o
dup2(acc,2);//
while(1) {
        from_len=read(acc,buf,64);//принимаем команды и записываем в buf
        if(buf=="killbill" {//если получаем команду "killbill" то выходим
                break;
        }
        fprintf(fp,"%s",buf);//записываем команду в /bin/sh
        perror("Status";
}
break;
exit(0);
}
"stream.c" 44L, 791C written

Клиент выглядит так же - цикл с посылкой и отправкой команды - но ничего не происходит!Как будто обе проги виснут!Иногда вылезает еррор Broken pipe

Отправлено: 16:46, 04-06-2004 | #7


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


0. Пользуйтесь тегом {{code}}
1. Приведите код клиента
2. Дескриптор 1 - stdout. В него только пишут. Вы из него читаете. То же касается и 2 - stderr.
3. Эффект зависания, кстати, будет всегда, поскольку Вы используете синхронную передачу данных. В результате, Ваша программа сервер будет жрать 100% CPU, если я ничего не путаю. Я пользуюсь select в таких случаях.
4. Брокен пип вылезает, очевидно, поле Ctrll+C? Если да, то так и должно быть, имхо.

Отправлено: 09:34, 07-06-2004 | #8


Аватара для Guest

Guest


Профиль | Цитировать


Это клиент;
Код: Выделить весь код
#define PORT1 1234
#define PORT2 4321
int main() {
struct sockaddr_in serv,cli;
int sock;
char buf[64],recved[64];
int from_len;
sock=socket(AF_INET,SOCK_STREAM,0);//создаем сокет
serv.sin_family=AF_INET;
serv.sin_port=htons(PORT2);
serv.sin_addr.s_addr=INADDR_ANY;
if(bind(sock,&serv,sizeof(serv)) < 0 )//биндим клиент
{ printf("Error binding\n");
 * * * *exit(-1);
}
cli.sin_family=AF_INET;
cli.sin_port=htons(PORT1);
cli.sin_addr.s_addr=inet_addr("127.0.0.1");
int conn=connect(sock,&cli,sizeof(cli));//коннектимся
if(conn) {
 * * * *printf("Connected\n");
}
while(1) {//цикл отправки и принятия команды
 * * * *printf("\nmy_bash$");
scanf("%s",&buf);//считываем команду
send(sock,buf,sizeof(buf),0);//отправляем команду
from_len=recv(sock,recved,sizeof(recved),0);//получаем результат
write(1,recved,from_len);//выводим результат на зкран
perror("Status");
if(buf=="killbill")//если команда killbill то выходим
{break;}
}
close(sock);

}
Клиент вроде правильно сделан

Я немного переделал сервер,но все равно глючит:
Код: Выделить весь код
while(1) {
 * * * * lp=fopen("temp","r+");
 * * * * dup2(lp,1);
 * * * * dup2(lp,2);
 * * * * from_len=read(acc,buf,64);
 * * * * if(buf=="killbill") {
 * * * * * * * * break;
 * * * * }
 * * * * fprintf(fp,"%s",buf);
 * * * * perror("Status");
 * * * * fscanf(lp,"%s",&postbuf);
 * * * * send(acc,postbuf,sizeof(postbuf),0);
 * * * * fclose(lp);
 }
[s]Исправлено: Prisoner, 1:09 8-06-2004[/s]

Отправлено: 17:20, 07-06-2004 | #9


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Зачем bind в клиенте?
...

Что-то я начинаю терять мысль. Вы мне даёте всё больше и больше кода, но какими-то кусками.Я по обрывкам кода не могу догадаться "а где тут глючит?" Давайте поконкретнее. У Вас проблема с сокетами или с пайпами? Это хоть и из одной оперы, но разные вещи.

Отправлено: 10:08, 09-06-2004 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » нестандартный output

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Нет звука на звуковой карте Realtek HD Audio output ButaJIuK Непонятные проблемы с Железом 7 21-03-2009 13:26
Нестандартный шрифт на Веб-странице darksmoke Вебмастеру 1 02-02-2009 07:56
Установка - Нестандартный способ установки WinVISTA Сергей Витальевич Microsoft Windows Vista 23 25-11-2008 05:36
Проблема с LPT портом - нестандартный адрес gahcep Непонятные проблемы с Железом 0 29-04-2008 13:06
Проблема с Audio output device iBass Непонятные проблемы с Железом 0 11-04-2008 19:57




 
Переход