LINUX.ORG.RU

помогите немогу понять куда девается stdout


0

0

нужно написать свой cd все работает прога гулят по папочкам тока вот почему-то stdout кудато делся...

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

#include <sys/stat.h>
#include <fcntl.h>

void detect_curpath(char* curpath);
int isdir(char* pathtogo,char* curpath);
void add(char* s1, char* s2);

int main()
{
	int out=dup(1);
	char* curpath;
	curpath=(char*)malloc(sizeof(char)*1024);
	detect_curpath(curpath);
	dup2(out,1);
	printf("%s :",curpath);
	char pathtogo[256];
	gets(pathtogo);
	while (strcmp(pathtogo,"exit"))
	{
		if (strlen(pathtogo)!=0)
		{
			int out=dup(STDOUT_FILENO);
			int i=strlen(curpath)-1;
			if (!strcmp(pathtogo,".."))
			{
				while (curpath[i]!='/')
				{
					curpath[i]='\0';
					i--;
				}
				curpath[i]='\0';
			}
			else
			if (pathtogo[0]=='/') {if (isdir(pathtogo,curpath)==1) strcpy(curpath,pathtogo);else printf("Error : Not a Directory\n");}
			else {if (isdir(pathtogo,curpath)==1) add(curpath,pathtogo); else printf("Error : Not a Directory\n");}
			dup2(out,STDOUT_FILENO);
			
		}
		fprintf(stdout,"%s :",curpath);
		gets(pathtogo);
	}	
	return 0;
}

void add(char* s1, char* s2)
{
	int i,len1=strlen(s1);
	s1[len1]='/';
	
	for (i=0;i<strlen(s2);i++)
	{
		s1[len1+i+1]=s2[i];
	}
	
}

int isdir(char* pathtogo,char* curpath)
{
	int out=dup(STDOUT_FILENO);
	char tmp[1024]="";
	strcpy(tmp,curpath);
	add(tmp,pathtogo);
	freopen("tmp","w",stdout);
	if (fork()==0)
	{
		char *cmd[]={"stat","--printf=%F",tmp,(char*)0};
		execvp(cmd[0],cmd);
	}
	wait(getppid());
	dup2(out,STDOUT_FILENO);
	int stdIn=dup(STDIN_FILENO);
	freopen("tmp","r",stdin);
	char* type;
	type=(char*)malloc(sizeof(char)*1024);
	gets(type);
	dup2(stdIn,STDIN_FILENO);
	if (fork()==0)
	{
 		char *ncmd[]={"rm","tmp",(char*)0};
		execvp(ncmd[0],ncmd);
	}
	wait(getppid());
	if (!strcmp(type,"Каталог")) return 1; else return 0;	
}

void detect_curpath(char* curpath)
{
	int out=dup(STDOUT_FILENO);
	freopen("tmp","w",stdout);
	if (fork()==0)
	{
		char *cmd[]={"pwd",(char*)0};
		execvp(cmd[0],cmd);
	}
	wait(getppid());
	dup2(out,STDOUT_FILENO);
	int stdIn=dup(STDIN_FILENO);
	int fd=open("tmp",O_RDONLY);
	dup2(fd,STDIN_FILENO);
	gets(curpath);
	dup2(stdIn,STDIN_FILENO);
	if (fork()==0)
	{
 		char *ncmd[]={"rm","tmp",(char*)0};
		execvp(ncmd[0],ncmd);
	}
	wait(getppid());
}

Ответ на: комментарий от kde4-hater

+1
Олсо, флушится поток при отсылке \n. Это я заметил из экспериментов с дебаггингом libgtk.
В общем, не стоит забывать про то что поток это поток, т.е. информацию нужно «проталкивать»(flush'ить).

tia ()
Ответ на: комментарий от big_buka

cd это _встроенная_ команда шелла. Отдельная программа может сменить только _свою_ текущую директорию, но не шелла из которого она запущена.

dilmah ★★★★★ ()

1. Пиши комментарии.

2.

поменять переменную PWD

man setenv

3.

просто нужно чтоб после работы моей программы директория действительно менялась

Она поменяется только для твоей программы. Как сказали уже, cd — встроена в shell.

4. Купи/скачай какую-нибудь книгу по программированию в UNIX.

5. В detect_curpath() лучше задействовать пайп, если уж узнавать текущую директорию с помощью pwd. На мой неопытный взгляд.

6. Реализация isdir() даже для меня, быдлоидного быдлокодера, ужасна. Есть системный вызов stat, нахрена вызывать стороннюю программу, а вот это вообще не дай бог в страшном сне увидеть:

if (!strcmp(type,"Каталог")) return 1; else return 0;  

7. Таки советую последовать пункту 4.

С наилучшими пожеланиями.

alg0rythm ()
Ответ на: комментарий от dilmah

>может сменить только _свою_ текущую директорию

..и делается это функцией chdir

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

> Отдельная программа может сменить только _свою_ текущую директорию, но не шелла из которого она запущена.

может.

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

>> Отдельная программа может сменить только _свою_ текущую директорию, но не шелла из которого она запущена.

может.

Как?

anonymous ()
Ответ на: комментарий от alg0rythm

я канешно критику приветствую...но просо я тока 2 день пишу под UNIX... про пайпы в мане почитал спасибо за совет)) если не трудно то подскажи книжку по программированию в UNIX. по поводу пункта 6...ничего другого просто в голову не пришло))) по этому так сделал))

big_buka ()
Ответ на: комментарий от big_buka

подскажи книжку по программированию в UNIX

Эээ, у меня есть Марк Рочкинд «Программирование под UNIX», мне ее подарили :-) Там есть всё, начиная от простого ввода-вывода до сетевого взаимодействия. На мой взгляд, книга стоящая, но, так как других я не читал, то хз :) Еще есть «UNIX. Профессиональное программирование» Стивенса, говорят стоящая вещь.
Ну и конечно, Керниган и Ричи :)

Пусть меня поправят более опытные, если что.

alg0rythm ()

Вот и нафига писать такой код? С одной стороны он не сталько феерчин что бы было смешно, с другой - настолько плох что станоится грустно...

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

А поподробнее? Что-то у меня не получается сделать как ты говоришь. А я даже не знаю почему.

anonymous ()
Ответ на: комментарий от anonymous
me@utnubu:~$ pwd
/home/me
me@utnubu:~$ ls
Ubuntu One  Видео  Документы  Загрузки	Картинки  Музыка  Общедоступные  Рабочий стол  Шаблоны
me@utnubu:~$ echo $$
2325
me@utnubu:~$ gdb program $$
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
program: No such file or directory.
Attaching to process 2325
Reading symbols from /bin/bash...(no debugging symbols found)...done.
Reading symbols from /lib/libncurses.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/libncurses.so.5
Reading symbols from /lib/tls/i686/cmov/libdl.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libdl.so.2
Reading symbols from /lib/tls/i686/cmov/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/tls/i686/cmov/libnss_compat.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libnss_compat.so.2
Reading symbols from /lib/tls/i686/cmov/libnsl.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libnsl.so.1
Reading symbols from /lib/tls/i686/cmov/libnss_nis.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libnss_nis.so.2
Reading symbols from /lib/tls/i686/cmov/libnss_files.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libnss_files.so.2
0x0036b422 in __kernel_vsyscall ()
(gdb) print chdir("/")
$1 = 0
(gdb) print setenv("PWD","/",1)
$2 = 0
(gdb) quit
A debugging session is active.

	Inferior 1 [process 2325] will be detached.

Quit anyway? (y or n) y
Detaching from program: /bin/bash, process 2325
me@utnubu:/$ pwd
/home/me
me@utnubu:/$ echo $PWD
/
me@utnubu:/$ ls
bin  boot  cdrom  dev  etc  home  initrd.img  lib  lost+found  media  mnt  opt	proc  root  sbin  selinux  srv	sys  tmp  usr  var  vmlinuz

вывод ls показывает, что текущая директория сменилась. Вот только pwd показывает старое значение, непонятно почему. Даже смена PWD не помогла. Лень разбираться.

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

>me@utnubu:/$ pwd /home/me

а что показывает вывод pwd?

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