|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » нестандартный output |
|
|
нестандартный output
|
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 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Если я правильно понял логику Вашей программы, то ошибка в том, что dup2 вызывается после popen. Поскольку popen по сути fork, дескрипторы будут унаследованы нормальные (на stdout), а не переопределенные (в файл). И зачем Вы перенаправляете stdin (id=0)? Наверное, надо 1 и 2.
|
Отправлено: 15:12, 03-06-2004 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Guest |
Я последовал вашему совету,но результат тот же!
Даже не работает такой код: FILE *fp; fp=fopen("output","w" dup2(1,fp) dup2(2,fp); printf("HEllo" почему так?Все равно на экран выводит! |
Отправлено: 16:51, 03-06-2004 | #3 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Неправильно указаны аргументы у dup2
Обратите внимание, что в примере я работаю с open, потому что dup2 работает с дескрипторами, а не FILE* |
Отправлено: 10:11, 04-06-2004 | #4 |
Guest |
Вроде работает!
Скорее всего из-за dup2() - но ведь в мане сказано что первый параметр - это старый дескриптор,а второй - новый,на который надо все перенаправлять! И лучше использовать int lp=open()? |
|
Отправлено: 12:34, 04-06-2004 | #5 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать В мане немного по-дургому написано. dup2 делает newfd копией oldfd, закрывая newfd, если это необходимо. Недопонимание возникает, если не знать, как работает просто dup(), а не dup2(). Так исторически сложилось...
Насчёт open и fopen - трудно сказть, что лучше. open универсальнее, но с ней немного труднее работать. |
Отправлено: 13:21, 04-06-2004 | #6 |
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 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать 0. Пользуйтесь тегом {{code}}
1. Приведите код клиента 2. Дескриптор 1 - stdout. В него только пишут. Вы из него читаете. То же касается и 2 - stderr. 3. Эффект зависания, кстати, будет всегда, поскольку Вы используете синхронную передачу данных. В результате, Ваша программа сервер будет жрать 100% CPU, если я ничего не путаю. Я пользуюсь select в таких случаях. 4. Брокен пип вылезает, очевидно, поле Ctrll+C? Если да, то так и должно быть, имхо. |
Отправлено: 09:34, 07-06-2004 | #8 |
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); } |
Отправлено: 17:20, 07-06-2004 | #9 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Зачем bind в клиенте?
... Что-то я начинаю терять мысль. Вы мне даёте всё больше и больше кода, но какими-то кусками.Я по обрывкам кода не могу догадаться "а где тут глючит?" Давайте поконкретнее. У Вас проблема с сокетами или с пайпами? Это хоть и из одной оперы, но разные вещи. |
Отправлено: 10:08, 09-06-2004 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Нет звука на звуковой карте 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 |
|