68user's page 掲示板

Prev< No. 2984〜3002> Next  [最新発言に戻る] [過去ログ一覧]
No. 2984 # SIGNAL 2002/12/12 (木) 18:51:54
OS: Solaris 2.5.1
プロセスの通知にシグナルを使っています。
これまで、SIGUSR1とSIGUSR2で間に合っていたのですが、
今回もう一つパターンの追加(SIGUSR3?)を行いたいのです。
そこで、質問なのですが
<signal.h>にシグナルを追加できるのでしょうか?
また、出来るとしたら注意しないといけない点や
影響を及ぼす範囲を教えて下さい。

よろしくお願いします。

No. 2985 # 68user 2002/12/13 (金) 12:45:23
>>2984 SIGNAL
シグナルの追加はカーネルを書き換えないと無理です。

シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり
をするのが正解でしょう。

と偉そうなことをいってますが、シグナルが足りず SIGXCPU を
使って逃げたことはあります。

No. 2986 # koko 2002/12/16 (月) 14:34:40
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス
が認識する方法があれば情報提供をお願いします。

・親プロセスはwaitしません。
・子プロセスは同じものが複数生成されます。(順次生成)

ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ
や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。
理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果
が格納されるようなものです。

No. 2987 # 68user 2002/12/18 (水) 08:51:46
>>2986 koko
> ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ
> や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、
の方法を取らないのであれば、無理なんじゃないでしょうか。

No. 2988 # hsj 2002/12/18 (水) 14:58:58
>>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 ---
かなり適当ですが。

No. 2989 # koko 2002/12/19 (木) 08:42:04
>>2988 hsj
他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。
試してみたいと思います。

>>2987 68user
今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に
なるかと思います。

ご回答頂き、ありがとうございました。

No. 2990 # 68user 2002/12/20 (金) 02:06:37
>>2986 koko
> ・親プロセスはwaitしません。
ってのは親プロセスにも手を入れたくないという意味かと思った
のですが、wait でブロックさせたくないという意図だったのですね。
読み違えておりました。

No. 2991 # Japper 2002/12/20 (金) 02:55:20
こんにちは
質問があってきました

Perlを使っていると
system関数やexec関数を使うようになりました
便利でとてもよいのですが
Root権限でコマンドが実行されているような気がします
くわしくはまだ確認していません。
また、CGIでファイルマネージャーを使っていますが
これも同じようにパスワードファイルなどを開かれるという欠点があります
全ディレクトリやファイルのパーミッションを000にすることはもちろんできませんし
一部だけのパーミッション設定もだめです
例)/homeを000にするが/home/userが777だとアクセスされてしまう

これらのことからセキュリティーホールとなっていてとても不安です
これらについての対処法はなにかないでしょうか?

No. 2992 # 68user 2002/12/20 (金) 03:08:40
>>2991 Japper
> Root権限でコマンドが実行されているような気がします
perl スクリプト中で
      print "$<\n";
      print "$>\n";
の結果のいずれかが 0 なら root 権限を得ています (が、おそらくは
勘違いではないかと思います)。

> これも同じようにパスワードファイルなどを開かれるという欠点があります
書きかけですが、
      http://x68000.startshop.co.jp/~68user/webcgi/cryptogram.html
が参考になるかもしれません。

No. 2993 # ruku [E-mail] 2002/12/20 (金) 13:27:36
初めまして!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

上記のレスポンスを取得してしまい、クッキーが取得できずに先に進めないのです。長くなってしまい、大変ご迷惑をお掛けしますがよろしくお願い致します。
では、失礼します。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2994 # hsj 2002/12/21 (土) 10:45:27
>>2993 ruku
いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と
.uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを
POSTすれば行けるんじゃないでしょうか。
この手のwebアプリはログイン後の画面ではCookieだけでなく、
それ以外の手段でもユーザを一意に識別する何らかの値を持ちまわらせ、
Cookieの(そのものでなく大抵はセッションオブジェクトなりDBなりに
入れた)値とのクロスチェックでユーザを認証している場合があります。
YAHOO!オークションがどうなっているかは知りませんが、
その手の仕組みが組み込まれているんじゃないでしょうか。

No. 2995 # 68user 2002/12/21 (土) 22:50:15
>>2993 ruku
うまくいかないときのアプローチとしては、まずはやっぱり telnet とか
Socket で直接つなぐ方がいいんじゃないでしょうかね。

アクセスに成功する QUERY は知っているし、失敗する QUERY も
知っているわけで (よくわかってませんが、OutputStreamWriter に
細工をすればリクエストの生データが取れるんですよね? )

その 2つの内容をつきあわせて一つ一つチェックすると。ないとは
思いますが、もしかしたら USER_AGENT で制限かけてたりする
かもしれませんし。

No. 2996 # kiki 2002/12/22 (日) 18:25:54
おひさしぶりです。kikiです。前回はお世話になりました。
今回もお聞きしたいことがあり、書き込ませていただきました。

今、私はbash(2.04)をいじって、以下のことが
したいと思っているのです。それは

1.コマンドが実行された時間をそのコマンド履歴といっしょに
    特定のファイルに出力する。(.bash_historyに
    タイムスタンプをつける感じです。
2.特定のファイルにコマンド履歴が追加されるタイミングを
  そのコマンドが打ち込まれた直後になるようにする。
    
このようなことはbashのソースを書き換えればできるのでしょうか?
どうかご教授をよろしくお願い致します。

P.S.
history -w の様なことを自動的にできればいいのですが、
historyコマンドは、シェル自身のコマンドなので無理でしょうし。
うーん。

No. 2997 # ruku 2002/12/23 (月) 12:44:14
>>2994 hsj
貴重なアドバイスありがとうございます。いちおう.uやcookieの値はお書きしたプログラムの前で取得しているので問題はないと思うのですが・・・。これがなかなか上手くいかないのです。

>>2995 68user
ソケットで試してみます。貴重なアドバイスありがとうございました。

No. 2998 # ruku 2002/12/23 (月) 13:55:38
度々すみません。ブラウザの設定で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を送る処理
しかプログラムでは行っていないはずなのに最後のヘッダの応答を取得して
しまうのはどうしてでしょうか?もしよろしければアドバイスよろしくお願いします。もしかしたら応答ヘッダの取得する場所が悪いのでしょうか?

No. 2999 # hsj 2002/12/24 (火) 03:44:56
>>2998 ruku
先ほど試しにncで
> いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と
> .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを
> POSTすれば行けるんじゃないでしょうか。
をやってみたところ、問題なく3つのCookieが発行されました。
#ただし、最初のGETは/cofig/login?.src=aucに対して行いました。
なので、プログラムが正確に上記の事を行えば問題なく行けると思いますが・・・。

No. 3000 # 68user 2002/12/24 (火) 14:28:48
> 2996
> このようなことはbashのソースを書き換えればできるのでしょうか?
入力を解析し、プロセスを実行しているのは bash なので、ソースに手を
いれれば何でも可能です。

No. 3001 # kiki 2002/12/25 (水) 11:14:10
>3000 68user様
お返事ありがとうございます.kikiです.
やってみましたところ、なんとかできました。
ありがとうございました。

No. 3002 # koko 2002/12/25 (水) 15:21:54
C言語で複数のプロセスが同一のファイルに対してログを出力する処理を作成したいのですが、このような共有書き込み用のファイルを設ける方法としてUNIXでよくやる方法というものはあるでしょうか。
もちろん、定石でなくても良いです。
できれば、書き込み時に自分でファイルをロック、アンロックしない、要するにできるだけ楽をしたいです。
ログの書き込みは同時に発生する可能性があります。
Windowsであれば、共有書き込みでファイルを開く関数があるのですが...。

●処理イメージ
1.親プロセスでログファイルを開く。
2.複数の子プロセスを起動し、親が開いたログファイルにログを出力する。
3.全子プロセス終了後にログファイルを閉じる。

よろしくお願い致します。

Prev< No. 2984〜3002> Next  [最新発言に戻る] [過去ログ一覧]