|
OS: Solaris 2.5.1 プロセスの通知にシグナルを使っています。 これまで、SIGUSR1とSIGUSR2で間に合っていたのですが、 今回もう一つパターンの追加(SIGUSR3?)を行いたいのです。 そこで、質問なのですが <signal.h>にシグナルを追加できるのでしょうか? また、出来るとしたら注意しないといけない点や 影響を及ぼす範囲を教えて下さい。 よろしくお願いします。 |
|
>>2984 SIGNAL シグナルの追加はカーネルを書き換えないと無理です。 シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり をするのが正解でしょう。 と偉そうなことをいってますが、シグナルが足りず SIGXCPU を 使って逃げたことはあります。 |
|
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス が認識する方法があれば情報提供をお願いします。 ・親プロセスはwaitしません。 ・子プロセスは同じものが複数生成されます。(順次生成) ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。 理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果 が格納されるようなものです。 |
|
>>2986 koko > ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ > や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、 の方法を取らないのであれば、無理なんじゃないでしょうか。 |
|
>>2986 koko > ・親プロセスはwaitしません。 親でSIGCHLDを拾ってwaitpid()のオプションWNOHANGで チェックするのもダメですか? --- snip --- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/wait.h> void handler(int sig) { int pid,status,code; while((pid=waitpid(-1,&status,WNOHANG))>0) { if(WIFEXITED(status)) { code = WEXITSTATUS(status); printf("child process:[%d] was exited with code:[%d]\n",pid,code); } } } int main(int argc,char *argv[]) { int i,pid,code; char buf[16]; struct sigaction sa; if(argc>1) { code = atoi(argv[1]); srand(code+time(0)); sleep(rand()%10); return code; } memset(&sa,0,sizeof(sa)); sa.sa_flags = SA_NOCLDSTOP; sa.sa_handler = handler; sigaction(SIGCHLD,&sa,0); for(i=0;i<10;i++) { if((pid=fork())<0) { perror("fork"); return -1; } if(pid) continue; sprintf(buf,"%d",i); if(execl("./a.out","./a.out",buf,0)<0) { perror("execl"); return -2; } } for(;;) sleep(1); return 0; /* never reaches */ } --- snip --- かなり適当ですが。 |
|
>>2988 hsj 他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。 試してみたいと思います。 >>2987 68user 今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に なるかと思います。 ご回答頂き、ありがとうございました。 |
|
>>2986 koko > ・親プロセスはwaitしません。 ってのは親プロセスにも手を入れたくないという意味かと思った のですが、wait でブロックさせたくないという意図だったのですね。 読み違えておりました。 |
|
こんにちは 質問があってきました Perlを使っていると system関数やexec関数を使うようになりました 便利でとてもよいのですが Root権限でコマンドが実行されているような気がします くわしくはまだ確認していません。 また、CGIでファイルマネージャーを使っていますが これも同じようにパスワードファイルなどを開かれるという欠点があります 全ディレクトリやファイルのパーミッションを000にすることはもちろんできませんし 一部だけのパーミッション設定もだめです 例)/homeを000にするが/home/userが777だとアクセスされてしまう これらのことからセキュリティーホールとなっていてとても不安です これらについての対処法はなにかないでしょうか? |
|
>>2991 Japper > Root権限でコマンドが実行されているような気がします perl スクリプト中で print "$<\n"; print "$>\n"; の結果のいずれかが 0 なら root 権限を得ています (が、おそらくは 勘違いではないかと思います)。 > これも同じようにパスワードファイルなどを開かれるという欠点があります 書きかけですが、 http://x68000.startshop.co.jp/~68user/webcgi/cryptogram.html が参考になるかもしれません。 |
|
初めまして!YAHOO!オークションのログインをプログラムで実行したいのですが、上手くいきません。ブラウザでの通信のlogをとり、プログラムを組んでいたのですが、どうしてもPOSTした後の3種類のクッキーがとれ ないのです。上手くいけば下のような3種類のクッキー(個人情報なので***になっています)が返されるのですが、 ・・・・・・・・・・ブラウザのlog・・・・・・・・・ <ブラウザのPOST> POST /config/login?5934sjuoe8ci4 HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Content-Length: 259 Pragma: no-cache Cookie: B=cv85agsv02md9&b=2 Connection: keep-alive Browser reload detected... Posting 259 bytes... .tries=1 .src=auc .last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc promo= .intl=jp .bypass= .partner= .u=cq4ce2ov02mdi .v=0 .fUpdate=Y hasMsgr=0 .chkP=Y .done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus login=******** passwd=*********** <レスポンス> HTTP/1.1 302 Found Date: Thu, 19 Dec 2002 05:31:58 GMT P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie:**** Set-Cookie:**** Set-Cookie:**** ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ このセッションがどうしても上手くいかず、3種のset-cookie が取得できないのです。大変お忙しい中恐縮ですが、もしよろしければ、アドバイスをよろしくお願いします。とても見せれるプログラムではありませ んが、下記に示します。 try{ URL u = new URL("http://login.yahoo.co.jp/config/login?5934sjuoe8ci4"); URLConnection uc = u.openConnection(); uc.setRequestProperty("Cookie:","B=cv85agsv02md9&b=2); uc.setDoOutput(true); uc.setDoInput(true); OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(), "EUC_JP"); query.Encode3(".tries","1"); query.Encode1(".src","auc"); query.Encode1(".last","http://login.yahoo.co.jp/config/edit_auc"); query.Encode1("promo",""); *query.Encode()はクエリー文字列にするための関数です。 query.Encode1(".intl","jp"); query.Encode1(".bypass",""); query.Encode1(".partner",""); query.Encode1(".u",data2); query.Encode1(".v","0"); query.Encode1(".fUpdate","Y"); query.Encode1("hasMsgr","0"); query.Encode1(".chkP","Y"); query.Encode1(".done","http://user.auctions.yahoo.co.jp/jp/show/mystatus"); query.Encode1("login",ID); query.Encode1("passwd",PW); out.write(query.toString()); out.write("\r\n"); out.flush(); out.close(); /////////////(1)////////////////////////////// for (int j = 0; ; j++) { String header = uc.getHeaderField(j); if (header == null) break; System.out.println(uc.getHeaderFieldKey(j) + ": " + header); } } catch (Exception a) { System.err.println(a); } ちなみに(1)で出力されたヘッダ情報は null: HTTP/1.1 200 OK Date: Thu, 19 Dec 2002 07:16:58 GMT Refresh: 900; URL=http://www.yahoo.co.jp/ Cache-Control: private Pragma: no-cache Expires: Thu, 05 Jan 1995 22:00:00 GMT Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: B=el2pemcv02sja&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp 上記のレスポンスを取得してしまい、クッキーが取得できずに先に進めないのです。長くなってしまい、大変ご迷惑をお掛けしますがよろしくお願い致します。 では、失礼します。 |
|
>>2993 ruku いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを POSTすれば行けるんじゃないでしょうか。 この手のwebアプリはログイン後の画面ではCookieだけでなく、 それ以外の手段でもユーザを一意に識別する何らかの値を持ちまわらせ、 Cookieの(そのものでなく大抵はセッションオブジェクトなりDBなりに 入れた)値とのクロスチェックでユーザを認証している場合があります。 YAHOO!オークションがどうなっているかは知りませんが、 その手の仕組みが組み込まれているんじゃないでしょうか。 |
|
>>2993 ruku うまくいかないときのアプローチとしては、まずはやっぱり telnet とか Socket で直接つなぐ方がいいんじゃないでしょうかね。 アクセスに成功する QUERY は知っているし、失敗する QUERY も 知っているわけで (よくわかってませんが、OutputStreamWriter に 細工をすればリクエストの生データが取れるんですよね? ) その 2つの内容をつきあわせて一つ一つチェックすると。ないとは 思いますが、もしかしたら USER_AGENT で制限かけてたりする かもしれませんし。 |
|
おひさしぶりです。kikiです。前回はお世話になりました。 今回もお聞きしたいことがあり、書き込ませていただきました。 今、私はbash(2.04)をいじって、以下のことが したいと思っているのです。それは 1.コマンドが実行された時間をそのコマンド履歴といっしょに 特定のファイルに出力する。(.bash_historyに タイムスタンプをつける感じです。 2.特定のファイルにコマンド履歴が追加されるタイミングを そのコマンドが打ち込まれた直後になるようにする。 このようなことはbashのソースを書き換えればできるのでしょうか? どうかご教授をよろしくお願い致します。 P.S. history -w の様なことを自動的にできればいいのですが、 historyコマンドは、シェル自身のコマンドなので無理でしょうし。 うーん。 |
|
>>2994 hsj 貴重なアドバイスありがとうございます。いちおう.uやcookieの値はお書きしたプログラムの前で取得しているので問題はないと思うのですが・・・。これがなかなか上手くいかないのです。 >>2995 68user ソケットで試してみます。貴重なアドバイスありがとうございました。 |
|
度々すみません。ブラウザの設定でcookieを無効にして再度logをとったら プログラムと同じになりました。次にlogを示します。 +++GET 457+++ POST /config/login?2v1pmh3i6v229 HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Content-Length: 259 Pragma: no-cache Connection: keep-alive Browser reload detected... Posting 259 bytes... .tries=1 .src=auc .last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc promo= .intl=jp .bypass= .partner= .u=5g07ercv0d4tr .v=0 .fUpdate=Y hasMsgr=0 .chkP=Y .done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus login=************* passwd=***************** +++RESP 457+++ HTTP/1.1 302 Found Date: Mon, 23 Dec 2002 04:40:38 GMT P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: ****** Set-Cookie: ****** Set-Cookie: ****** +++CLOSE 457+++ +++GET 458+++ GET /config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Pragma: no-cache Connection: keep-alive Browser reload detected... +++RESP 458+++ HTTP/1.1 200 OK Date: Mon, 23 Dec 2002 04:40:38 GMT Refresh: 900; URL=http://www.yahoo.co.jp/ Cache-Control: private Pragma: no-cache Expires: Thu, 05 Jan 1995 22:00:00 GMT Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: B=2m7te28v0d4u6&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp +++CLOSE 458+++ cookieを無効にしても3種のcookieはとれるようなのです。しかも最後の ヘッダの応答はプログラムでもとれているのです。ただ、POSTを送る処理 しかプログラムでは行っていないはずなのに最後のヘッダの応答を取得して しまうのはどうしてでしょうか?もしよろしければアドバイスよろしくお願いします。もしかしたら応答ヘッダの取得する場所が悪いのでしょうか? |
|
>>2998 ruku 先ほど試しにncで > いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と > .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを > POSTすれば行けるんじゃないでしょうか。 をやってみたところ、問題なく3つのCookieが発行されました。 #ただし、最初のGETは/cofig/login?.src=aucに対して行いました。 なので、プログラムが正確に上記の事を行えば問題なく行けると思いますが・・・。 |
|
> 2996 > このようなことはbashのソースを書き換えればできるのでしょうか? 入力を解析し、プロセスを実行しているのは bash なので、ソースに手を いれれば何でも可能です。 |
|
>3000 68user様 お返事ありがとうございます.kikiです. やってみましたところ、なんとかできました。 ありがとうございました。 |
|
C言語で複数のプロセスが同一のファイルに対してログを出力する処理を作成したいのですが、このような共有書き込み用のファイルを設ける方法としてUNIXでよくやる方法というものはあるでしょうか。 もちろん、定石でなくても良いです。 できれば、書き込み時に自分でファイルをロック、アンロックしない、要するにできるだけ楽をしたいです。 ログの書き込みは同時に発生する可能性があります。 Windowsであれば、共有書き込みでファイルを開く関数があるのですが...。 ●処理イメージ 1.親プロセスでログファイルを開く。 2.複数の子プロセスを起動し、親が開いたログファイルにログを出力する。 3.全子プロセス終了後にログファイルを閉じる。 よろしくお願い致します。 |