Задачка про Юникс и Си
Mar. 8th, 2008 11:47 pmВот задача про Юникс и Си, её придумал пользователь
avysk, а я слегка модифицировал.
Написать на Си коротенькую программу, которая при вызове через конвейер выдаёт фразу "Hello, world!\n", а при вызове с командной строки выдаёт ту же строку, но не один, а два раза.
Короче, вот так:
$ my_prog
Hello, world!
Hello, world!
$ my_prog | cat -
Hello, world!
$
Конечно есть функция isatty, с помощью которой можно просто проверить, запущена ли программа с терминала, вот так:
if(isatty(1))...else...;
Поэтому дополнительное условие: этой функцией (или подобными ей) пользоваться нельзя.
И вот что интересно - пользователь
ilya_dogolazky запостил очень похожую задачу.
Похожую, да решающуюся несколько иначе, хоть и непросто найти отличия в условии.
Написать на Си коротенькую программу, которая при вызове через конвейер выдаёт фразу "Hello, world!\n", а при вызове с командной строки выдаёт ту же строку, но не один, а два раза.
Короче, вот так:
$ my_prog
Hello, world!
Hello, world!
$ my_prog | cat -
Hello, world!
$
Конечно есть функция isatty, с помощью которой можно просто проверить, запущена ли программа с терминала, вот так:
if(isatty(1))...else...;
Поэтому дополнительное условие: этой функцией (или подобными ей) пользоваться нельзя.
И вот что интересно - пользователь
Похожую, да решающуюся несколько иначе, хоть и непросто найти отличия в условии.
no subject
on 2008-03-10 12:21 pm (UTC)Ну, можно смухлевать и воспользоваться ttyname, если ограничение касается только isatty. Можно позвать ioctl(STDOUT_FILENO, TCGET ...), но это тоже жульничество, ибо isatty - это просто обертка для этого ioctl.
Можно попробовать почитать из STDOUT_FILENO в неблокируемом режиме: если это перенаправление, то будет EBADF, а если будет EAGAIN, то перенаправления не было. Но, боюсь, это не переносимо. На линуксе это так, а на других системах сейчас проверить нет возможности.
Можно позвать fstat, который все расскажет, но это не интересно.
В общем, решений масса, но "прикольное" что-то не придумывается.
no subject
on 2008-03-10 12:30 pm (UTC)