• 締切済み

cat

プロセス間通信をしたいのでが、まず mknod mypipe p でpipeを作成後 送信側プロセスで echo "hoge" > mypipe& でpipeに送信。 ブロッキングを回避する為に バックグラウンド処理にしています。 受信側プロセスでは cat < mypipe >> hogehoge.file でファイルに保存しています。 この受信側プロセスでのcatのブロッキングを 回避する方法って無いのでしょうか? (ひょっとしてcatはEOFを待ってます?) よろしくお願い致します。

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

#1です。 >この無限ループは10秒周期で実施されていて処理A、処理Bは定周期的に実行したい処理でもあります。 やっぱりそんな感じですか。でも質問に書いてない事は答えようが無いので。 パイプへの入力と無関係にA,Bを10秒周期で実行したいのであれば別々にループをまわせばいいので、要件は「パイプの入力があれば即座に、無くても遅くとも10秒後には実行したい」ということですよね?こんな感じでどうでしょう?(全角空白で段つけしてますのでコピペするなら注意) while true do (sleep 10; echo -n > mypipe)&  pid=$!  data=`cat mypipe`  kill $pid 2>/dev/null  case "$data" in  "") echo NO DATA in 10sec ;;  *) echo data is "$data" ;;  esac done

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

>(ひょっとしてcatはEOFを待ってます?) EOFというかパイプがデータで一杯になるかクローズされるまで待ちますが、echo は hoge を書いたらすぐ出力をクローズして終了するので cat も終了すると思います。 つまりブロックはされるがすぐ終了します。

f_attck
質問者

補足

御回答ありがとうございます。 送信側のechoは、不定期に発生するものだと考えていただけないでしょうか。 処理的には、受信側のcatは無限ループの一文で、 while true do cat ..... ....A ....B sleep 10 done のような処理をしております。 この無限ループは10秒周期で実施されていて処理A、処理Bは定周期的に実行したい処理でもあります。 そこで、送信側のechoが発生しない場合にもこの周期でループをまわす事は可能でしょうか?

関連するQ&A

  • メールヘッダのFromについて

    お世話になります。 メールアドレスについて質問です。 受信したメールヘッダを見て思うのですが、送信者の設定や使用するメーラーに よってメールアドレスの表記方法が以下のようにまちまちなのですが、 hogehoge <hoge123@hoge.co.jp> hoge123@hoge.co.jp (hogehoge) メールを送信する側のFromの基本の形(ルール)というものは決められていないのでしょうか? よろしくお願いいたします。

  • シェルスクリプト外部からのデータ参照

    初心者で失礼があれば申し訳ございません。 お力を頂ければ幸いです。何卒よろしくお願いします。 以下に「hogehoge.nic」と「hogehoge.df」という外部ファイルがあります。 $ cat ./hogehoge.nic nic="210.175.250.212" $ cat ./hogehoge.df /dev/mapper/VolGroup00-LogVol00 /dev/hda1 tmpfs ====================================================================== 上記を呼び出したいシェルがあります。 $ cat ./hogehoge.sh #!/bin/sh NIC=/home/user/hogehoge.nic DF=/home/user/hogehoge.df echo ${NIC} echo ${DF} DF=`df -k` echo test df echo ${DF} ====================================================================== 実行結果 $ ./hogehoge.sh /home/user/hogehoge.nic /home/user/hogehoge.df test df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 234410632 1869312 220441736 1% / /dev/hda1 101086 12004 83863 13% /boot tmpfs 516860 0 516860 0% /dev/shm ======================================================================= 上記実行結果ではなくて、hogehoge.shでhogehoge.nicとhogehoge.dfの中身を呼び出したい。 下記ファイルの中身を呼び出したいです。 $ cat ./hogehoge.nic nic="210.175.250.212" $ cat ./hogehoge.df /dev/mapper/VolGroup00-LogVol00 /dev/hda1 tmpfs

  • Unix初心者による初心者シェルプログラミングです。

    Unix初心者による初心者シェルプログラミングです。 以下のようなコマンドを羅列しただけの スクリプトが300行(実質100行ぐらい)が漸くできるようになりました。 これだけで、おばかさんな私は進化してます。が・・・ 対象となる、hoge.txtは、同ディレクトリ内に別名で、200ファイル有ります。 このスクリプトがその別名、200ファイルへと対象になります。 と云う事はファイル名分の200ファイル分スクリプトを編集して用意しなくては いけなくなる。 となると・・・ 別の事をしないといけませんよね。 どうやら、同ディレクトリ内にある、全ての .txt ファイルに対してこの スクリプトを実行させるには・・・ (よくわかりませんが・・・) FILE=`/home/foo/*.txt` みたいな・・・(全然違うと思っていますが、イメージで) /home/foo/ 内の .txt ファイルを一ファイルずつ読み込んで、実行させる方法が あると思うのですが・・・ 全てを教えて貰うつもりはありません。 学習していきます。 でも、疲れてきました。 がしかし、やらなくちゃいけません。 ヒント下さい。 お願いします! > cat hogehoge.sh #!/usr/bin/sh DAY=`/usr/xpg4/bin/date '+%Y/%m/%d%a'` HUMAN=`/usr/ucb/whoami` TIME=`/usr/xpg4/bin/date '+%H:%M:%S'` echo echo "$DAY : $HUMAN : PID $$" echo echo "$0" echo echo "$TIME Let's start!" echo echo "ls -l /home/foo/hoge.txt" ls -l /home/foo/hoge.txt echo echo "cat -n /home/foo/hoge.txt | head -15" cat -n /home/foo/hoge.txt | head -15 echo echo "sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt" sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo echo "cat -n /home/foo/new-hoge.txt | head -18" cat -n /home/foo/new-hoge.txt | head -18 echo echo "sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt" sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt echo echo "ls -l /home/foo/renewal-hoge.txt" ls -l /home/foo/renewal-hoge.txt echo echo "diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt" diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt echo echo "sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt" sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo ・ ・ ・ ・ ・ ・ ・ ・ 300

  • PHPで動的に生成されるCSVをサーバーに保存

    業務処理を自動化するためにPHPで動的に生成されるCSVファイルを、WEBサーバーに保存したいと思っています。 wgetコマンドを使って保存しようと思っていますが、リンクにGETパラメータ?(http://hogehoge.com/hoge.php?hoge=1&hoge=2)が設定されているためかcsvが生成さずPHPページ(hoge.php)が保存されてしまいます。 実行したwgetコマンド /usr/local/bin/wget /home/useraccount/www/hoghog/hog.csv 'http://hogehoge.com/hoge.php?hoge=1&hoge=2' -O - また、phpファイルを生成し、 <?php $file = 'http://hogehoge.com/hoge.php?hoge=1&hoge=2'; $newfile = 'test.csv'; if (!copy($file, $newfile)) { echo "failed to copy $file...\n"; } ?> と上記のようにやっても同じ結果でした。 ブラウザ上のURLバーでhttp://hogehoge.com/hoge.php?hoge=1&hoge=2とするとCSVファイルの保存画面が出てくるページなのですが、何か良い方法はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Thunderbirdでデフォルト表示の差出人情報を変更

    Thunderbird 3.0を利用しています。 今まで hoge@hogehoge.com というメールアカウントを持っておりましたが、 このたび別途 aaa@hogehoge.com というアカウントを取得し、同じくThunderbirdに 設定を行いました。 そうしたら、受信は問題ないのですが、送信の際に、 今まではデフォルトで(というか1アカウントしかなかったので) 差出人のところは hoge@hogehoge.com が表示されていましたが、新アカウントを入れて以降は aaa@hogehoge.com が表示されてしまいます。 デフォルト表示をhoge@hogehoge.comにすることはできないのでしょうか。 ちなみに、アカウント設定画面の差出人情報を書き換えて、 hoge@hogehoge.comを入力しましたが、メール作成画面で 表示される情報はaaaの方でした。 教えてください・・・

  • メールのヘッダ(From)について

    こんにちわ。 メール送信スクリプトを作りたいと思っております。 受信者のメールソフトの「送信者」欄に、メールアドレスではなく、日本語名を入れたいのですが、ヘッダのFrom部分の構成をどのようにすればいいのでしょうか。 例えば From: "hogehoge" <hoge@hoge.com> (受信したメールのヘッダを見るとこうなっていましたので・・・) これでは動きませんでした。メールのFrom欄の仕様などあるのでしょうか。ご指導のほどよろしくお願いいたします。

    • ベストアンサー
    • CGI
  • シェルスクリプトの関数

    #!/usr/bin/bash SOURCEBASE="`echo \"$1\" | sed 's/\.[^.]*$//'`" DOCLEAN='no' # 「-c」オプションで削除するファイルの拡張子一覧 CLEANEXTS='aux log toc lof lot bbl blg idx ind ilg' show_help() {   cat <<EOF autolatex [options] latex-source[.tex]  -c  Clean temporary files before typesetting EOF   exit 1 } do_clean() {   for ext in $CLEANEXTS; do    if [ -f ${SOURCEBASE}.${ext} ] ; then      echo "hoge1"      echo ${SOURCEBASE}.${ext}      rm ${SOURCEBASE}.${ext}    fi   done } if [ $# -eq 0 ] ; then  show_help  exit 1 fi while getopts c: flag; do   case ${flag} in   c) DOCLEAN='yes';;   \?) exit 1;;   esac done do_clean #if [ ${DOCLEAN} = 'yes' ] ;then # # echo "hoge2" # do_clean #fi やりたいこととしては*.auxや*.logファイルを-cのオプションをつけた時に削除されることです. とりあえず手始めに取り合えず動くかの確認をしました $ bash test.sh hoge.tex hoge1 hoge.aux hoge1 hoge.log 次にコメントアウトしている部分を取り除いて(さらにその上にあるdo_cleanもコメントアウトします) #do_clean if [ ${DOCLEAN} = 'yes' ] ;then  echo "hoge2"  do_clean fi $ bash test.sh -c hoge.tex hoge2 同様に実行しました.結果は上のようになりif分はtrueで認識されているのですが,その次のdo_cleanでecho部分でのhoge1が表示されません. if分で分岐させている時は関数を別の呼び方で呼ばないといけないのでしょうか? さらに, do_clean if [ ${DOCLEAN} = 'yes' ] ;then  echo "hoge2"  # do_clean fi このようにしても結果は変わりませんでした. (オプションでなにか気をつけなければならない?) オプションをつけたときだけ該当するファイルを削除したいです,ご教授ねがいます><(なお空白はすべて全角空白になっています)

  • 名前付きパイプを使い文字列をブロードキャスト

    名前付きパイプを利用して、文字列をブロードキャストしたいと考えています。 --- シェル1$ cat > fifo --- シェル2$ cat fifo --- シェル3$ cat fifo --- のような状態で、シェル 1 で hello と入力し、Enter キーを押下すると、シェル 2 およびシェル 3 に hello と表示させたいのですが、実際にはシェル 3 (後から fifo を開いたシェル)にしか印字されません。 シェル 1 にて入力を終了(EOF送信)すると、シェル 2 、シェル 3 ともにファイルがクローズされ、cat が終了しているので、EOF は両方ともにブロードキャストされているようにも見え、動きが不可解です。 Q1) 名前付きパイプ fifo は、その名のとおり、「早い者勝ち」でデータを取得した方にしかデータが流れないんでしょうか。 Q2) その場合、親子関係なくプロセス間で、複数のプロセスに対して同一の文字列をブロードキャスト方法は、どのようにすればスマートでしょうか。 一度、通常ファイルに出力を書き込み、全プロセスが文字列を取得した事を監視してキューを削除する、みたいな方法は可能だと思いますが、これよりも良い方法があればお教えください。

  • 死なない(不思議な?)プロセスの振舞いについて

    プロセスの振舞いでよく分からない点がありますので、 この点に詳しい方、ぜひご教授下さい。 実験として、次のような無限ループをもつシェルスクリプトを作りました。 #!/bin/sh while : do echo "hogehoge" > tmp echo "Please stop me!" sleep 1 done このfile名を loop.sh として、実行属性を付けてから $ ./loop.sh & とバックグラウンドで実行してみます。 すると、1秒毎に、tmpにhogehogeと書き込まれ 標準出力にPlease stop me!と標準出力に表示されますが、 ここで、 exitコマンドでterminalを急に閉じてみます。 こうした場合、どうやら、このプロセスは何処かで生き続けるようなのです。 というのも、新たにterminalを起動し、上で出来た tmp をrmで消そうとしても、 すぐ新たなtmpが作られるからです。 しかも、単にlogoutしただけではこのプロセスは死なないようです。 (再起動するとさすがに止まります。) そこで質問ですが、 1) 上のプロセスが生き続けていることを確認する方法はありますか? 2) この生き続けたプロセスを再起動せずに殺す方法はありますか? 3) このようにシェルスクリプト実行中に急にexitをされた場合でも、 スクリプトが正常終了するように予めスクリプトを組むことは出来ますか? 以上3点についてご教授いただけたら幸です。 よろしくお願いします。

  • パイプを用いた通信 C#とMATLAB

    パイプを使用しC#から送信したデータをMATLABで受信することは可能でしょうか?   もし可能であるならばどのようにすればよいのでしょうか。 以下のプログラムで行っているのですがMATLAB側で受信ができず -1がかえってきてしまいます C言語で受信する場合はうまくいくのですがMATLABを使用するとファイルのopneができません。 以下C#・MATLABプログラム C# <プログラム> 送信側 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; namespace PipeTest { class Program { static void Main(string[] args){ Console.WriteLine("パイプ接続待ち..."); NamedPipeServerStream pipe = new NamedPipeServerStream("test"); pipe.WaitForConnection(); Console.WriteLine("送信(キーを押すと終了)"); StreamWriter stw = new StreamWriter(pipe); stw.AutoFlush = true; while(Console.KeyAvailable == false) { stw.WriteLine("This is a test"); System.Threading.Thread.Sleep(500); } Console.WriteLine("終了"); pipe.Close(); } } } MATLAB <プログラム> 受信側 fp = fopen('C:\\\\.\\pipe\\test');