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 回答頂き、ありがとうございます。 安心しました。 |
>>3114 68user ご回答ありがとうございました 大変助かりました さて、findコマンドでファイルを検索をかけていますが 大きいファイル順に並べ替えるなど そのようなことはできないでしょうか? |
C言語のプログラムでsystem関数でプログラムを呼び出します。 引数に存在しないプログラムを指定した場合のsystem関数の戻り値が-1になる時と256になる時があります。 256の時は、上位8ビットが1なのでシェルのexitコードが1のような気がするのですが、何も環境を変えていないのに戻り値が-1や256に変わる理由が思い浮かびません。 何度も繰り返していると-1と256が不規則に交互します。 この情報だけで何か分かりますでしょうか。 よろしくお願いします。 |
>>3121 Japper > さて、findコマンドでファイルを検索をかけていますが > 大きいファイル順に並べ替えるなど 大きいってファイルサイズのことですか? もしそうなら find . -ls | sort +7 とか。 >>3122 koko > system関数の戻り値が-1になる時と256になる時があります。 FreeBSD の system(3) がおっしゃるには The system() function returns the exit status of the shell as returned by waitpid(2), or -1 if an error occurred when invoking fork(2) or waitpid(2). A return value of 127 means the execution of the shell failed. だそうです。 |
>>3123 68user 確かに、私が調べたところでも同じ事が記述されていました。 試しに簡単なmainを作って存在しないコマンドをsystemで呼び出すとsystemの戻りは256(おそらくシェルの返すexitコード=1)だけでした。 -1は戻りませんでした。 256と-1が交互になるのは何か他の原因かもしれません。 もう少し調べてみます。 ありがとうございました。 |
>>3124 koko 256と-1が交互になる件は解決しました。 SIGCHLDのシグナルハンドラを登録してあった為、シグナルハンドラが割り込んだ時のみsystemの戻り値が-1になっていた様です。 SIGCHLDをマスクしたところ、戻り値は256で安定しました。 |
find コマンドについて質問があります。 ファイル名で検索をかけたいと思うのですが、 UNIXだと英数字の大文字・小文字を区別してしまうので、例えば、 「a」で検索した場合、「A」というファイルは引っかからないかと 思います。 大文字・小文字の区別無く引っ掛けたいと思うのですが、その様な オプション又は方法はありますか? |
>>3126 bebe 最近の *BSD find や GNU find なら -iname とか -iregex とか。 そうでない find なら広めにひっかけて grep で絞りましょう。 |
>>3127 68user findコマンドで引っ掛けられたらいいかと思ったのですが、 やっぱり広めに検索をかけて、grep等で絞り込むしかなさそ ですね。 参考になりました。 有り難うございます。 |
始めまして、いつもこちらでは陰ながら勉強させていtだいてます。 perlスクリプトのことでお教えください ただ今企画中のスクリプトにおいて 外部コマンド実行時、そのコマンドプロセスの標準入力へ有る意味大量のデータ(文字列)を渡したいのです しかしこの方法が全く頭に浮かばず情け無い状態であります! PIPEやファイルシステムの基礎を知らない私にご教授下されば幸いです。 |
>>3129 もも open(OUT, "| command"); print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE...."; close(OUT); ってことですか? じゃなくて command の標準入力に渡しつつ、そのコマンドの 出力を受け取りたいなら IPC::Open2 などを使えばできます。 できますが、デッドロック回避などが面倒なので open(OUT, "| command > file"); print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE...."; close(OUT); open(IN, "< file"); while (<IN>){ .... } でいーんではと思う軟弱な私。 |
>>3139 金床 68user様なるほど理解しました前者が出来ればいいのです! 早速試してみます。ありがとうございました! |
親プロセスが複数の子プロセスを生成します。 親は子プロセスの終了をシグナル(SIGCHLD)ハンドラで検知し、waitで子プロセスの終了コード(exitの引数)を取得しています。 同時に、子プロセス数を減算します。(forkで子プロセス数を加算しています。) シグナルハンドラの処理中に、別の子プロセスが終了した場合、SIGCHLDが無視されてしまう。 あるいは、ほぼ同時に複数の子プロセスが終了した場合には、1回しかSIGCHLDのシグナルが発生しないとの記述を見た事があるのですが、正しく全ての子プロセスの終了を検知する方法はありますでしょうか。 以前、頂いたNo. 2988で頂いた以下の方法でこのような懸念が解消されますでしょうか。 SIGCHLDのシグナルハンドラ-------------------------- int pid,status,code; while((pid=waitpid(-1,&status,WNOHANG))>0){ if(WIFEXITED(status)){ code = WEXITSTATUS(status); } } -------------------------------------------------- また、waitpidがシグナルに割り込まれるとエラーになり、errnoにEINTRが設定されると思うのですが、WNOHANGを設定していた場合にはそのような事は無いと考えてしまって良いでしょうか。 よろしくお願いします。 |
>>3132 koko まずは sigaction(2) を読んでください。 # わたしもよくわかってないので読んでいるところ。 |
>> 3133 読んでみます。 |
ソケット(TCP)に関する質問です。 サーバ(UNIX)とクライアント(WinSock)がソケットで通信しています。 サーバがクライアントに対してwriteでデータを送り、クライアントがrecvでそれを読む処理を作成しました。 サーバでwriteし、すぐにソケットそcloseすると、クライアントではrecvできずにエラーになります。(既に接続が破棄されている。) サーバ側でwriteして、すぐにcloseしている事が原因の様です。 writeとcloseの間に1秒程度の時間をおくと、クライアントはrecvできました。 このように、writeとcloseが連続すると相手がrecvできないケースは当然の事なのでしょうか。 それとも、通常はrecvできるはずであり、他に問題がありそうでしょうか。 同じ経験をした事のある方がの意見なども聞けると助かります。 よろしくお願いします。 |