dimrub: (Default)
[personal profile] dimrub
Вот задача про Юникс и Си, её придумал пользователь [livejournal.com profile] avysk, а я слегка модифицировал.

Написать на Си коротенькую программу, которая при вызове через конвейер выдаёт фразу "Hello, world!\n", а при вызове с командной строки выдаёт ту же строку, но не один, а два раза.
Короче, вот так:

$ my_prog
Hello, world!
Hello, world!
$ my_prog | cat -
Hello, world!
$

Конечно есть функция isatty, с помощью которой можно просто проверить, запущена ли программа с терминала, вот так:
if(isatty(1))...else...;
Поэтому дополнительное условие: этой функцией (или подобными ей) пользоваться нельзя.

И вот что интересно - пользователь [livejournal.com profile] ilya_dogolazky запостил очень похожую задачу.
Похожую, да решающуюся несколько иначе, хоть и непросто найти отличия в условии.




on 2008-03-08 10:49 pm (UTC)
Posted by [identity profile] sartoris.livejournal.com
EBADF?

Ответная задачка:

Bookintosh:user$ ./my_prog
Hello world 1!
Hello world 2!
Bookintosh:user$ ./my_prog | cat -
Hello world 2!
Hello world 1!

on 2008-03-09 12:00 am (UTC)
Posted by [identity profile] ilya-dogolazky.livejournal.com
Если вы имеете в виду
printf("Hello, world 1\n") ;
fprintf(stderr, "Hello, world 2\n") ;
то тут вот какое дело: в обеих исходных задачах вывод происходит в stdout, а stderr вообще не задействован: можно смело ко всем вызовам приписать 2>/dev/null и ничего не изменится.

А в каком смысле "bad file descriptor"?

on 2008-03-09 12:15 am (UTC)
Posted by [identity profile] sartoris.livejournal.com
А в каком смысле "bad file descriptor"?

В смысле что

fd = fcntl(STDOUT_FILENO, F_DUPFD, 0);
write( fd, hello, strlen( hello ) );
in = read( STDIN_FILENO, rx, 0 );
if( in != -1 )
write( fd, hello, strlen( hello ) );

ну и в обратную сторону раскручивается с тем же успехом. Я не помню как это фифект оффициально называется (с чтением STDOUT), но вот такая вот байда.

Если вы имеете в виду
printf("Hello, world 1\n") ;
fprintf(stderr, "Hello, world 2\n") ;


Совершенно верно. Но это была ответная задачка.

on 2008-03-09 01:10 am (UTC)
Posted by [identity profile] ilya-dogolazky.livejournal.com
Как сообщают ниже, можно прямо так читать, без dup: http://dimrub.livejournal.com/646117.html?thread=9677541#t9677541
Но это не то :-)

Profile

dimrub: (Default)
Adventures of a somewhat curious character

September 2013

S M T W T F S
12 345 67
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 25th, 2025 08:41 am
Powered by Dreamwidth Studios