нужен совет с пользовательской командной строкой Linux / UNIX "cal" в C - PullRequest
0 голосов
/ 31 марта 2009

Хорошо, мне нужно сделать так, чтобы эта программа отображала «cal» 3 месяца (один месяц до и один месяц после) бок о бок, а не один месяц, который она отображает в любой Linux / UNIX. У меня получилось работать, чтобы отобразить 3 календаря, используя "system(customCommand)" три раза; но тогда это не бок о бок.

Я получил подсказку использовать следующие системные вызовы:

close(..) pipe(..) dup2(..) read(..) and write(..)

мой вопрос: с чего мне начать? Нужно ли создавать дочерний процесс и чем его ловить в pipe(..)?

Как я могу отобразить три календаря рядом.

отл.

    February 2009          March 2009             April 2009
 S  M Tu  W Th  F  S    S  M Tu  W Th  F  S    S  M Tu  W Th  F  S
 1  2  3  4  5  6  7    1  2  3  4  5  6  7             1  2  3  4
 8  9 10 11 12 13 14    8  9 10 11 12 13 14    5  6  7  8  9 10 11
15 16 17 18 19 20 21   15 16 17 18 19 20 21   12 13 14 15 16 17 18
22 23 24 25 26 27 28   22 23 24 25 26 27 28   19 20 21 22 23 24 25
                       29 30 31               26 27 28 29 30

Ответы [ 6 ]

6 голосов
/ 31 марта 2009

если "cal -3" не работает, просто используйте paste:)

$ TERM=linux setterm -regtabs 24
$ paste <(cal 2 2009) <(cal 3 2009) <(cal 4 2009)
    febbraio 2009            marzo 2009              aprile 2009
do lu ma me gi ve sa    do lu ma me gi ve sa    do lu ma me gi ve sa
 1  2  3  4  5  6  7     1  2  3  4  5  6  7              1  2  3  4
 8  9 10 11 12 13 14     8  9 10 11 12 13 14     5  6  7  8  9 10 11
15 16 17 18 19 20 21    15 16 17 18 19 20 21    12 13 14 15 16 17 18
22 23 24 25 26 27 28    22 23 24 25 26 27 28    19 20 21 22 23 24 25
                        29 30 31                26 27 28 29 30

$   

(setterm игнорирует -regtabs, если TERM=linux или TERM=con.)

6 голосов
/ 31 марта 2009

Предполагая, что вы хотите написать это самостоятельно, вместо использования "cal -3", я бы сделал (в коде псевдо):

popen three calls to "cal" with the appropriate args

while (at least one of the three pipes hasn't hit EOF yet)
{
  read a line from the first if it isn't at EOF
  pad the results out to a width W, print it
  read a line from the second if it isn't at EOF
  pad the results out to a width W, print it
  read a line from the third if it isn't at EOF
  print it
  print "\n"
}

pclose all three.
3 голосов
/ 31 марта 2009

просто сделай

cal -3 
1 голос
/ 31 марта 2009

Хорошо, а как же cal -3?

cal -3 12 2120, чтобы сделать его особенным месяцем и годом, с одним до и одним после.

1 голос
/ 31 марта 2009

Разве это не работает?

cal -3

0 голосов
/ 31 марта 2009

Подход, который я бы использовал для этого, состоял бы в том, чтобы захватить вывод, разбить его на строки и распечатать строки рядом друг с другом. Вероятно, я бы сделал это на Perl, а не на C.

Или просто используйте cal -3, если он есть у вашего cal.

...