سؤال

لدي زوج من قذيفة البرامج التي تتحدث أكثر من المسمى.القارئ يخلق الأنابيب عندما تبدأ ويزيل ذلك عند خروجها.

أحيانا الكاتب محاولة الكتابة إلى الأنابيب بين الوقت أن القارئ يتوقف عن القراءة و الوقت الذي يزيل الأنابيب.

reader: while condition; do read data <$PIPE; do_stuff; done
writer: echo $data >>$PIPE
reader: rm $PIPE

عندما يحدث هذا, كاتب تعليق إلى الأبد تحاول فتح الأنابيب للكتابة.

هل هناك نظيفة طريقة إعطائها مهلة ، بحيث لن تبقى معلقة حتى قتل يدويا ؟ وأنا أعلم أنني يمكن أن تفعل

#!/bin/sh
# timed_write <timeout> <file> <args>
# like "echo <args> >> <file>" with a timeout

TIMEOUT=$1
shift;
FILENAME=$1
shift;
PID=$$

(X=0; # don't do "sleep $TIMEOUT", the "kill %1" doesn't kill the sleep
 while [ "$X" -lt "$TIMEOUT" ];
 do sleep 1; X=$(expr $X + 1);
 done; kill $PID) &

echo "$@" >>$FILENAME
kill %1

ولكن هذا هو نوع رديء.هل هناك قذيفة مدمج أو القيام بذلك الأمر أكثر نظافة (بدون الخروج التحويل البرمجي C)?

هل كانت مفيدة؟

المحلول 3

هذا الزوج من البرامج يعمل أكثر من ذلك بكثير لطيف بعد إعادة مكتوب في بيرل استخدام يونكس المجال مآخذ بدلا من أنابيب الاتصال المسماة.مشكلة معينة في هذا السؤال ذهبت بعيدا تماما, لأنه إذا/عندما نهاية واحدة يموت الاتصال يختفي بدلا من الشنق.

نصائح أخرى

UNIX "المعيار" طريقة التعامل مع هذا استخدام نتوقع, الذي يأتي مع توقيت-تشغيل على سبيل المثال:تشغيل البرنامج فقط كمية معينة من الوقت.

أتوقع يمكن أن تفعل المعجزات البرمجة ، تستحق التعلم منه.إذا كنت لا تحب Tcl, هناك بيثون نتوقع وحدة أيضا.

يأتي هذا السؤال بشكل دوري (على الرغم من أنني لا يمكن العثور عليه مع البحث).لقد كتبت اثنين من البرامج النصية قذيفة لاستخدام مهلة الأوامر:واحدة من الأشياء التي قراءة الإدخال القياسية واحدة من الأشياء التي لا تقرأ الإدخال القياسية.هذا مقزز و كنت أنوي كتابة برنامج C, لكني لم أصل إليها بعد.أود أن أوصى بالتأكيد كتابة timeout القيادة في ج مرة واحدة وإلى الأبد.لكن في الوقت نفسه, هنا أبسط من اثنين من البرامج النصية قذيفة ، الذي توقف إذا كان الأمر يقرأ المدخلات القياسية:

#!/bin/ksh

# our watchdog timeout in seconds
maxseconds="$1"
shift

case $# in
  0) echo "Usage: `basename $0` <seconds> <command> [arg ...]" 1>&2 ;;
esac

"$@" &
waitforpid=$!

{
    sleep $maxseconds
    echo "TIMED OUT: $@" 1>&2 
    2>/dev/null kill -0 $waitforpid && kill -15 $waitforpid
} &
killerpid=$!

>>/dev/null 2>&1 wait $waitforpid
# this is the exit value we care about, so save it and use it when we
rc=$?

# zap our watchdog if it's still there, since we no longer need it
2>>/dev/null kill -0 $killerpid && kill -15 $killerpid

exit $rc

أخرى النصي على الانترنت في http://www.cs.tufts.edu/~nr/قطرة/مهلة.

trap 'kill $(ps -L $! -o pid=); exit 30' 30
echo kill -30 $$ 2\>/dev/null | at $1 2>/dev/null
shift; eval $@ &
wait
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top