>>3076 山田 ご回答ありがとうございます。 >仕事や課題を丸投げされると答える側もつまらないです。質問するなら >もっとおもしろい質問をしてください。 了解しました。 先日、ほぼ一日調査してたのですが出来なかったもので。。。 申し訳ないです。。 |
>>3067 68user うまくいきました。 本当にありがとうございました。 perlの方も挑戦してみます。 度々の質問で申し訳ありませんが、 grepの正規表現で"'"(シングルクォーテーション) を出さないようにしたいのですが、 うまくいきません。 grep '[\']' <file> だとダメみたいです。 どうすればよいのでしょうか? 初心者の質問ですみません。 よろしくお願いします。 |
>>3082 美春 grepは行単位で処理するので、シングルクォートを含む行を表示しない、 という処理は可能です。grepに-vをつけると、条件に合わない行のみを 出力するので、 % grep -v "'" filename とすればfilenameファイル内のシングルクォートを含まない行のみを 出力してくれます。 もしシングルクォートを文字単位で削除したいのであれば、 % sed -e "s/'//g" < filename とすればよいと思います。 |
No. 3083 has 感動してしまいました。 manで調べろと怒られるかと 思ったのにご丁寧に ありがとうございました。 |
こんにちは、山田です。 shellにワイルドカードを含んだ引数を文字列として渡したいのですが上手くいきません。 例えば、 aaa.sh zz*.txt や aaa.sh zz\*.txt と渡すとローカルにある対象となるtxtファイルを全て引数としてもってきてしまいます。 aaa.sh zz'\''*'.txt などとしてもダメなようです。 出来ないのでしょうか? 申しわけありませんが、教えて下さい。 |
>>3085 山田 さん、 シェルはなんでしょうか? zsh だと > echo *.txt aaa.txt bbb.txt ccc.txt > echo '*.txt' *.txt のようになりました。 |
>>3086 ふくし 様、ご回答ありがとうございます。 cshです。 やりたいことは、 aaa.sh ZZ*.txt と指定した時にshell内で、 set filename = arg[1]とし、 filenameに"ZZ*.txt"という文字列をセットしたいのです。 |
>>3087 山田 さん 下で書いたつもりだったんですが (^^;;; 引数「ZZ*.txt」全体をシングルクォート '' で囲んだらどうなります? |
>>3086 ふくし 様 >引数「ZZ*.txt」全体をシングルクォート '' で囲んだらどうなります? やはりカレントの該当するファイルが引数に入ってしまいます。 arg[1]の内容が"ZZa.txt ZZb.txt ZZc.txt"というような感じです。 んー、こまっております(^^;) |
>>3089 山田 % cat hoge set filename='*.c' echo $filename % csh -fx hoge set filename=*.c echo *.c a.c b.c c.c d.c というわけで、csh では ただの文字列として set しても、 glob 展開されます。よって、参照するたびに echo "$filename" とダブルクォートで囲むか (面倒)、あるいは set noglob で変数を展開しないようにする、と。 もっとよいのは perl や ruby などに乗り換えることです。 |
>>3089 山田 さん、 知らぬこととはいえ失礼しました。 そんな致命的な非互換があろうとは、、。 シュバング行で #! /bin/sh と書いてしまって、Bourne Shell で書き直すってのは どうでしょうね。 コマンドを手入力するのは csh 系が、 シェルスクリプトを組むのは Bsh 系がいいって聞いた気がします。 (気のせいか? ;;; もっぱら私はちょっとでも論理のあることは Perl にするのでどっちも知りませんが、、。 |
始めましてopといいます。 ・・・いきなり質問で申し訳ないのですが、 掲示板を作っていて コメントを書き込んだ後に更新をすると、 前のコメントが追加されてしまいます これを回避する為にはいったいどんなコードに 書けがよいのでしょうか? 宜しければアドバイスの程お願いします。 |
>>3092 op 書き込み後に↓こんなHTMLを表示すればいいのでは。 <html><head><title>書きこみました。</title><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"><meta content=5 http-equiv=refresh></head><body>書きこみが終わりました。<br><br>画面を切り替えるまでしばらくお待ち下さい。<br><br></body></html> 別のページに移動させたければ、 <meta content=5 http-equiv=refresh> ではなく、 <meta content=5;URL=../homepage/index.html http-equiv=refresh> としてみる。 ・・・といった方法ではどうでしょう。 |
以前にBASIC認証の質問のご回答を頂きありがとうございました。 おかげさまで認証を行うサイトへのアクセスが出来るようになりました。 現在はPOSTが行えるクライアントを作成中です。 POST及びchunkedに関する質問ですが、 あるサイトにアクセスした際に Content-type: text/x-hdml; Charset=Shift_JIS Transfer-Encoding: chunked 省略 postmethod="post" postdata="xxxxxxx" 省略 とのレスポンスがあり print SOCKET "POST /$path HTTP/1.1\r\n"; print SOCKET "Host: $host\r\n"; print SOCKET "User-Agent等リクエストヘッダ" $message = "xxxxxxx"; $len = length($message); print SOCKET "Content-length: $len"."\r\n\r\n"; print SOCKET "$message"; にてPOSTを行っているのですが、POSTされません。 原因としてはどういった事が考えられますでしょうか。 chunkedでエンコードされ送られたデータはPOSTする際もchunkedで エンコードして送り返さなければいけないのでしょうか。 もしエンコードしたデータをPOSTしなければいけない場合はchunkedの エンコード方法をお教え下さい。 宜しくお願い致します。 |
>>3093 DQN..cc様 早速のレス有難う御座います♪ なるほど・・・。 確かにこういった処理をする掲示板なんどか見かけた事がありました 本来の意味はこういう事?だったのですね(多分 それと、また質問で恐縮なのですが リフレッシュ以外にも他の方法なんかありますかね?(^^; |
>>3095 op ここの掲示板では書き込みのたびに書き込み内容のMD5を作成し、 キャッシュしておいた最新数件分のMD5と同一の場合には記録しない、 という方式を採用しています。 詳しくはここの掲示板のソースを参照してみてください。 |
>>3094 しん >chunkedでエンコードされ送られたデータはPOSTする際もchunkedで >エンコードして送り返さなければいけないのでしょうか。 そんなことは無いです。 >もしエンコードしたデータをPOSTしなければいけない場合はchunkedの >エンコード方法をお教え下さい。 要するにデータを細切れ(例えば1024byte毎)にして、 サイズ(16進) データ サイズ(16進) データ … 0 とすればいいだけです。(see http://www.studyinghttp.net/rfc_ja/2616/sec3.html#sec3.6.1) で、解決方法ですが、とりあえずHTTP/1.0で送ってみて下さい。 それでも失敗した場合は、とりあえずチャンク周りが原因ではありません。 |
>>3096 has様 MD5ですかぁ〜レベルが一気に上がったような気がしますが、 これからさっそく勉強していきたいと思います(苦笑 ほんとにhasさん、DQN..ccさん有難う御座いました。 |
Linux User という本に5つのディストリビューションが一気に 付録についてるので慌てて買ったんですけど、 よく考えるとコレ(よく考えなくても)CD じゃなくて DVD なんですよね、、。 会社で遊んでるマシンが1個あって、ただし会社のマシン管理のヒトが バックアップしてくれないから、バックアップデバイス兼ねて この機会に DVD-RAM を入れようかなあと思ったんですが、 Linux で読める DVD-RAM ドライブってあるんでしょうかね。 じっさいにはネットワーク経由で Debian(woody)を入れたので、 もう雑誌の付録は必要なくなったんですが、、 |
>>3099 ふくし > Linux で読める DVD-RAM ドライブってあるんでしょうかね。 FreeBSD でも DVD-RAM を読み書きできるくらいですから、 できなくはないでしょうけど、具体的な機種名などは わかりません。 検索すると DVD-RAM 対応カーネルパッチが云々などと いうのが引っかかるのですが、Linux 事情に疎いので それが最新の情報なのか判断できないです。 # てゆーか、DVD-RAM どころか CD-R さえ使ったことが # ないので。 |
findコマンドについて教えてください。 find . -user root とするとカレントディレクトリ以下の 所有者がrootになっているファイルが引っかかるかと思い ます。 それではなくて、所有者がrootになっていないファイルを 引っ掛けたいと思うのですが、その場合findコマンドはどの ように使えばいいでしょうか? 宜しくお願いします。 |
>>3101 bebe > 所有者がrootになっていないファイル % find . ! -user root % find . -false -user root % find . -not -user root などなど。 FreeBSD 4.7-RELEASE のマニュアルには ! と -false と -not が 書いてあるのに % find . -not -name \*.c find: -not: unknown option となってしまう。なぜだろう。ソースを見ると -not は効きそうなんだけれども。 http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/find/option.c http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=find&dir=jpman-4.7.0%2Fman |
send()について教えてください。 send()にてデータを送信しようとするとperrorにて「Illegal Seek」 と返ってきます。もちろんデータも送信できていません。 この現象の原因と対処法を教えていただけないでしょうか? socketとconnectはできています。 |
>>3103 wataru > Illegal Seek ってことは errno が ESPIPE なのでしょうけれど、手もとにある FreeBSD と Solaris2.6/8 を見ても、send(2) が ESPIPE を返すとは書いてありませんので、 わかりません。 てゆーか、OS 名も、OS のバージョンも、エラーの起こるコード例も提示せず 質問している、あなたという人間がわかりません。 |
ご無礼大変申し訳ありませんでした。現在私はHard Hut Linux2.0 でプログラムを組んでいます。 原因のソースコードは以下の様です。 if ((*s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // TCPでソケットを開く perror("socket"); s_vMsgSnd(TSK_ER , 71 , 40); return -1; } syslog(LOG_DEBUG,"s = %d",*s); syslog(LOG_DEBUG,"port = %d",port); // 接続に必要な情報を設定する memset((char *) &server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr = dst_ip; //<GT_0010> server.sin_port = htons(port); s_vSigTimer(TIMER_START); alarm(TIMEOUT_SEC); if (connect(*s, (struct sockaddr *) &server, sizeof server) < 0) { // サーバとのコネクションを確立する perror("connect"); s_vSigTimer(TIMER_STOP); return -1; //<GT_0003> add } s_vSigTimer(TIMER_STOP); signal(SIGPIPE,ReCNCT); if(usCnctNG == FLAG_ON) return -1; 上記の方法でconnectまで持っていきます。 その後 while(sendbytes < MaxLENGTH){ nSended=send(*s,psz,strlen(psz),0); if(nSended == -1){ perror("SendError:"); s_vMsgSnd(TSK_ER , 71 , 57); s_vSigTimer(TIMER_STOP);return -1; }else if(counttim > 0){ syslog(LOG_DEBUG,"+*+*+*+*time over +*+*+*+*"); s_vSigTimer(TIMER_STOP);return -1; } psz+=nSended; sendbytes+=nSended; } でMaxLENGTHに達するまでデータを送信します。 |
>>3102 68user 解凍有り難うございました。 (1)% find . ! -user root ⇒うまくいきました。 (2)% find . -false -user root (3)% find . -not -user root (2)と(3)は、ダメでした。オプションエラーになってしまいます。 でも、(1)だけでも使えればとりあえずはOKなので、重宝しています。 |
>>3105 wataru > Hard Hut Linux2.0 Embedded ですか (Hut じゃなくて Hat ですね)。この OS の存在を 初めて知りました。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/send.2.html の内容が正しければ、Linux の send(2) は ESPIPE を返しません。 ただし開発元がカーネルに手を入れている可能性があるので Hard Hat Linux の send(2) は ESPIPE を返すのかもしれません。 マニュアルに send(2) がどういうときに ESPIPE を返すか書いて ありませんか? # まぁライセンスは GPL でしょうから、最悪ソースを読めばわかる # わけで。 あと、 >>3105 wataru のソースを眺めましたが、間違いらしきものは見付けられませんでした。 ただ、TCP では普通 send(2) は使いません。別に使っても構わない はずですが、埋もれているバグを踏まないという意味では、素直に write(2) を使った方がよいと思います。ただ、それで直るかどうかは わかりません。 あとは、マルチスレッド環境なので errno の値が別のスレッドに上書き されたとか…(多分違うと思いますけど)。 |
>>3102 68user > ソースを見ると -not は効きそうなんだけれども。 そっか。 options はソートされていることが前提なのに (bsearch(3) に渡すから)、 { "-nouser",c_nouser,f_nouser,0 }, { "-not",c_simple,f_not,0 }, の順で並んでいるからか。 # http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/find/option.c?rev=HEAD |
ありがとうございます。 大変もうしわけありませんが、もう一つ教えていただけないでしょうか? SSLでの通信も行っているのですが、SSL_write()を使用する際に タイムアウトの時間を設定したいのですが、方法がわかりません。 selectを使えばできるとも聞いたのですが、具体的にどうすればよいでしょうか ソースは以下の様です。 MaxLENGTH = strlen(psz); while(sendbytes < MaxLENGTH){ syslog(LOG_DEBUG,"Send"); nSended = SSL_write(SOKET, psz, strlen(psz)); if(nSended == -1){ perror("SendError:"); s_vMsgSnd(TSK_ER , 71 , 57); return -1; psz+=nSended; sendbytes+=nSended; } return 0; } お手数ですがよろしくお願いします。 |
ESPIPEの件は、また別のところで起こっていたようです。 仰る通り、sendによるものではありませんでした。 お手数をおかけしました。 |
そういや(質問でも答でもなく雑談ですが、いいんですかね) せっかく自分のサーバー立てたんだから、XML::DOM 入れてみよう!(^^) |
>>3110 wataru > ESPIPEの件は、また別のところで起こっていたようです。 しょーもないミスですが、ありがちですね。 >>3109 wataru > SSLでの通信も行っているのですが、SSL_write()を使用する際に > タイムアウトの時間を設定したいのですが、方法がわかりません。 使ったことはありませんが、 http://www.openssl.org/docs/ssl/SSL_CTX_set_timeout.html とか、 http://www.openssl.org/docs/ssl/SSL_get_fd.html でディスクリプタを取得して select とか、あるいは単純に alarm とか、でしょうか。 |
こんばんわ CGIのフォームメールで添付ファイルを送っているのですが 途中で通信を中止すると サーバー上にファイルが残ってしまうということに悩まされています そのフォームメールはQMAILを用いてメールを配信しています POPサーバーはVPOPMAILです 対処法はなにかありますでしょうか? |
>>3113 Japper シグナルをキャッチするという方法もありますが、単にファイルを 消したいだけなら - 送信し終わったらファイル名をリネーム or ファイルの置き場所を 変える (mv) - フォームメールが起動したとき、リネーム前 or 実行途中の置き場所 にあるファイルで、タイムスタンプが古いものを消す。 が単純でよいと思います。 |
親プロセスでFILE* fpに対してファイルをオープンします。 その後、forkで子プロセスを生成し、子プロセスですぐにfclose(fp)を行います。(子プロセスではファイルを使用しない為。) 子プロセスでファイルをfcloseした後、親プロセスでは引き続きfpに対して読み込みや書き込みを行えるでしょうか。 ファイルディスクリプタは、子プロセスで閉じても親プロセスに影響無いようですが、ファイルポインタは共有されている(?)様なので影響がありそうな気がするのですが、いかがでしょうか。 ■知りたい事 1.最終的に親と子でそれぞれfclose(fp)を行う必要があるか。 (開いたものは必要であれば明示的に閉じるようにしたい。) 2.子プロセスでfcloseしても、親プロセスのfpに影響がないか。 よろしくお願い致します。 |
>>3115 koko > 1.最終的に親と子でそれぞれfclose(fp)を行う必要があるか。 > 2.子プロセスでfcloseしても、親プロセスのfpに影響がないか。 fork したときの出力用バッファにデータがたまっていれば、子の fclose でバッファがフラッシュされます。そこで親も fclose すれば 同じ内容のバッファがファイルに出力され、同じ内容のデータが 2回書かれることになります。 なお fclose(3) しなかったとしても、exit(3) すれば結局は fclose されます。 # _exit(2) ならされません。 よって、 1. fflush(fp) 2. fork 3. 子は fclose (*A)、親は引き続き fp を使う がよろしいかと。 *A は、してもしなくても変わりませんが、子で使わないという 意志を明確に示すために fclose(3) した方がよいと僕は思います。 |
>>3115 koko 早速回答頂き、ありがとうございます。 動作を確認しましたところ、fflushしないと二重でデータが書き込まれていました。 fflushして回避する事にします。 もうひとつ、教えて頂けますでしょうか。 FILE*ではなく、ファイルディスクリプタに対してopen、write、closeで同じ事をした場合、ファイルディスクリプタはバッファリングされないのでfflushのような事をしなくても二重書き込みにはならないでしょうか。 実は、FILE*とファイルディスクリプタの両方を使用して同じ事をしている為、ちょっと心配になりました。 実動作を見た限りでは、ファイルディスクリプタは二重で書き込まれていない様なので大丈夫だとは思いますが...。 よろしくお願い致します。 |
>>3316 tomotomo No.3317は>>3316の間違いです。 すいません。 |
>>3117 koko > ファイルディスクリプタはバッファリングされないのでfflushのような事を > しなくても二重書き込みにはならないでしょうか。 されません。低レベル入出力システムコールはバッファリングが ないので大丈夫です。 |
>>3119 68user 回答頂き、ありがとうございます。 安心しました。 |