ページ更新: 2014-02-25 (火) (1125日前)

Cygwin 1.7.1 が2009-12-23 に出ましたが、Cygwin 1.7系に対して、このページの内容が通用するかどうかは判りません。

目次

[編集]

strftimeでタイムゾーンオフセットが間違っている? (2014-02-25) #

(調査中: 1台のPCしか、試していません。)

環境

$ cygcheck -cd cygwin libgcc1 tzcode
Cygwin Package Information
Package              Version
cygwin               1.7.28-2
libgcc1              4.8.2-2
tzcode               2013d-1

strftime で TZ=Asia/Tokyo のとき、%z (UTCからのオフセット)を表示させると、正しい値を出力しません。

strftime_check.cpp:

#include <cstdio>
#include <ctime>

int main() {
    time_t rawtime;

    time(&rawtime);
    tm * timeinfo = localtime(&rawtime);

    const size_t size = 128;
    char buf[size + 1] = {0};
    strftime(buf, size, "%Z %z", timeinfo);
    puts(buf);

    return 0;
}
$ TZ=JST-9 ./strftime_check
JST +0900     ★OK

$ TZ=Asia/Tokyo ./strftime_check
JST +1000    ★BAD

straceでトレースしたら、/usr/share/zoneinfo/Asia/Tokyo を読んでました。 書式は http://ja.wikipedia.org/wiki/Tz_database で、Cygwin の tzcode パッケージの2013d-1 版に含まれています。

$ strace -o log strftime_check

$ file /usr/share/zoneinfo/Asia/Tokyo
/usr/share/zoneinfo/Asia/Tokyo: timezone data, version 2, 3 gmt time flags, 
3 std time flags, no leap seconds, 9 transition times, 3  abbreviation chars 

$ cygcheck -f /usr/share/zoneinfo/Asia/Tokyo
tzcode-2013d-1

$ cygcheck -l tzcode | grep Tokyo
/usr/share/zoneinfo/Asia/Tokyo
/usr/share/zoneinfo/posix/Asia/Tokyo
/usr/share/zoneinfo/right/Asia/Tokyo

Ubuntu 10.04.4 LTS では、問題なし。

$ TZ=Asia/Tokyo ./strftime_check
JST +0900

$ TZ=JST-9 ./strftime_check
JST +0900

$ dpkg -S /usr/share/zoneinfo/Asia/Tokyo
tzdata: /usr/share/zoneinfo/Asia/Tokyo

$ dpkg -l tzdata
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ 名前           バージョン  説明
+++-================-================-================================================
ii  tzdata           2013g-0ubuntu0.1 time zone and daylight-saving time data
[編集]

ログインシェルでログイン時に実行されるbash_completion が遅いので、無効にした (2010-11-01) #

bash-completionパッケージをインストールしている場合、ログインシェルでログインするときに時間がかかる件について。

(このことは数年前(Cygwin-1.5.xのころ)に気が付いて手元のPCすべてで対処していたが、 最近Cygwinを再インストールしたときにこの対処を忘れていたため、今回まとめておく)

Windows XP Professional SP3, cygwin 1.7.7-1, bash-completion 1.2-1 にて。

$ cygcheck -cd bash-completion cygwin
Cygwin Package Information
Package              Version
bash-completion      1.2-1
cygwin               1.7.7-1

ログインシェルとして起動すると、やたら遅い。(bash --login -i、あるいは mintty -)。 PentiumM 1.1GHz (Pentium M 733J - Dothan, PC/NEC PC-VY11FBHET) を30秒間程度100%使用している。 (Microsoft Sysinternals Process Explorerで確認)

実行経路: /etc/profile → /etc/profile.d/* → /etc/profile.d/bash_completion.sh → bash_completion

bash-completionパッケージをアンインストールするのも億劫なので、名前を /etc/profile.d/bash_completion.sh-disable に変更して無効化した。

bash-completion について

  • Bash-Completion project
  • Cygwin bash-comletionパッケージの付属文書 (cygcheck -l bash-completion | grep /doc/)
    • Cygwin の /usr/share/doc/bash-completion/README
    • Cygwin の /usr/share/doc/Cygwin/bash-completion.README
[編集]

SIGSEGV発生時の終了コードを調べてみた 2005-02-13 #

segfault.c

int
main(int argc, char *argv[]) {
    volatile int *p = 0;
    if (argc == 1) {
        *p = 1;
    }
    return 0;
}

コンパイル

$ gcc -O -Wall segfault.c -o segfault.exe

実行

$ ./segfault; echo $?
Segmentation fault (core dumped)
139

実行

$ ./segfault 0; echo $?
0
  • 終了ステータスが128 以上、つまりbit7が立っているので、コアダンプ。(未確認だけど)
  • bit7をoffにすると139 - 128 = 11。つまり、SIGSEGV (Segmemtation Fault) が原因。
$ kill -l
(略)
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
(略)

$ kill -l 11
SEGV

$ kill -l segv
11
[編集]

Windows側のユーザの反映 (2004-11-06) #

sshdやproftpdで使うために、環境を用意する手順。 不必要な作業もあるけど、そこらへんは余り考えていない。

環境は Windows XP Professional SP1で、ローカルユーザのみ考慮。

1. Windows にユーザを追加する。ここでは仮に 'user' とする。 2. mkpasswd, mkgroup を使って、/etc/passwd, /etc/groups を作り直す。 (もし、過去に手で修正しているなら、バックアップしておいて後で手で反映)

$ mkpasswd -l > /etc/passwd
$ mkgroup -l > /etc/group

3. 追加したユーザで bash を起動してみる。/home/ユーザ名 ディレクトリが 作成され、.bashrc, .inputrc などが作成される。(これって /etc 以下に ひな形があるはずだが、調べてない)

$ runas /user:user 'c:\cygwin\bin\bash.exe --login -i'
user のパスワードを入力してください:
c:\cygwin\bin\bash.exe --login -i をユーザー "HOSTNAME\username" として開始しています.
..
[編集]

プロセスごとのメモリ消費量 (2004-07-26) #

ps コマンドや top コマンドの出力(top -b -n1 のようにバッチモードを使う)で 調べてもよいが、

/proc ファイルシステムを使って、たとえば次のようにしてみる。 ( Life with Cygwin 3 のシェルスクリプト流用)

この場合、/proc/*/exename と /proc/*/status の VmRSS を出している。

#!/bin/sh

for x in /proc/*
do if [ -r $x/exename ]
   then echo `cat $x/exename` `grep VmRSS $x/status | awk '{print $2}'`
   fi
done

これを progmem ってファイルに入れて、chmod +x して、実行してみる。

$ ./procmem
/usr/bin/bash 3760
/usr/sbin/httpd 3832
/usr/sbin/httpd 3832
/usr/sbin/httpd 3832
/usr/sbin/httpd 3836
/usr/sbin/httpd 3832
/usr/bin/sh 1940
/usr/bin/bash 1896
/usr/bin/bash 3724
/usr/bin/bash 3756
/usr/bin/cygrunsrv 2292
/usr/bin/cygrunsrv 2260
/usr/sbin/cygserver 2172
/usr/sbin/httpd 4724
/usr/sbin/inetd 2144
/usr/sbin/inetd 2832

なお、(少なくとも)Cygwin の top は /proc/*/ から情報を得ている。 使っているエントリは strace コマンドで調べることができる。

$ strace -o top.log top -b -n1
★ strace が終了すると、top.logができているので、これを見る。
[編集]

エクスプローラでフォルダの右クリックからbashを呼ぶ (2004-06-21) #

  • 補足 (2004-10-14)
  • cygwin-announce ML より。Cygwinのパッケージに chere が追加 された。 このパッケージは 'This adds items to the Explorer Drive and Directory context menus' で、このメモと同じ事を自動的にやってくれる。

Customize - Cygwin覚え書き - エクスプローラでフォルダの右クリックからbashを呼ぶ より。

PowerToy の 'Command Prompt Here' を Cygwin の bash でやる手法。

  • \HKEY_CLASSES_ROOT\Directory\shell に追加すれば、「ごみ箱」では出なくなるが、 「マイ ドキュメント」でも出なくなるので、悩ましい。2004-07-07
  • PowerToy のが「Command Prompt Here」だったから、やっぱ「Bash Prompt Here」かしらん。
  • どうせだから(<意味不明)~/.bashrc じゃなくて、/etc/bash.bashrc に 組み込んでみたり。

c:\bin\bashhere.cmd

@echo off
rem エクスプローラでフォルダの右クリックからbashを呼ぶ
rem http://lamoo.s53.xrea.com/customize/index.html#cygwin

set BASH_HERE_CURRENT_DIRECTORY=%1
C:
chdir C:\cygwin\bin

bash --login -i

bashhere.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell\bash]
@="Cygwin bash"

[HKEY_CLASSES_ROOT\Folder\shell\bash\command]
@="c:\\bin\\bashhere.cmd \"%1\""

/etc/bash.bashrc

# System-wide .bashrc file

if [ ! -z "$BASH_HERE_CURRENT_DIRECTORY" ]; then
    cd "$(echo "$BASH_HERE_CURRENT_DIRECTORY" | tr -d "\"" | cygpath -u --file -)"
    unset BASH_HERE_CURRENT_DIRECTORY
fi
[編集]

Cygwin Bash Shell 終了時の「バッチ ジョブを終了しますか」を回避 #

  • cmd.exe 経由で発生。
  • minttyckやCygTermを使ってれば発生しない。

Cygwinをインストールしたときに作成されるショートカット「Cygwin Bash Shell」を 使ってbashを実行しているとき、一度でも ctrl-C を入力すると、bashの終了時に 次のメッセージが表示される。

$ exit
logout
バッチ ジョブを終了しますか (Y/N)?

この原因は、このショートカットがc:\cygwin\cygwin.batを実行しているためなので、ショートカットで直接、bashを起動するように変更した。

cygwin_bash.png

[編集]

エラーでデバッガ起動 (未確認) #

CYGWIN=error_start=c:\cygwin\bin\gdb.exe
[編集]

emacsを^X^Cで終了できない #

emacsをctrl-X ctrl-C で終了できないので、こうする。

alias emacs='CYGWIN=tty emacs'

ただし、emacs終了後にコンソールで、キーボード入力が何も表示されなくなるが、 resetコマンドで解消できる。

[編集]

hexdumpいろいろ (2003-11-18) #

cygwin-mlの'how to do "hexdump" to analyze special white-space characters?'より。

cat -vet
od
dump
xxd

xxd -g1 が一番見慣れた表示になる。 なお、任意位置の表示は-seekと-lenを使う。

$ xxd -g1 -seek 0xb4 -len 0x05 file
00000b4: ff 93 fe f0 70                                   ....p
2003.12.14追記
emacsのhexl-mode。(Snort-users-jp MLより)
ファイルを開くとき M-x hexl-find-file するか、開いた後に M-x hexl-mode する。
[編集]

whatisデータベースの作成 #

/var/cache/man を作成した後、/usr/sbin/makewhatisを実行する。 これでwhatis, apropos, man -k が使えるようになる。