Guest User

Untitled

a guest
Sep 22nd, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. #!/usr/bin/ksh93
  2.  
  3. # poll(1) builtin test
  4.  
  5. typeset -T circus_t=(
  6. typeset fifo_name
  7. integer in_fd
  8. integer out_fd
  9.  
  10. function cinit
  11. {
  12. integer pid
  13. # fixme: we can't assign fd directly because ast-ksh.2012-08-13 has a bug
  14. # with "redirect"
  15. integer fd
  16. _.fifo_name="$1"
  17. rm -f "${_.fifo_name}"
  18. mkfifo "${_.fifo_name}"
  19.  
  20. # little "trick" with fifos - "redirect" would block if
  21. # there is no reader... so we create one in a
  22. # sub-process and kill it below after we opened the fd
  23. { redirect {dummy}<"${_.fifo_name}" ; for (( ;; )) ; do sleep 3600 ; done ; } &
  24. (( pid=$! ))
  25.  
  26. redirect {fd}>"${_.fifo_name}"
  27. (( _.out_fd=fd ))
  28. #printf '%s: outfd=%d\n' "${_.fifo_name}" _.out_fd
  29.  
  30. kill $pid ; wait
  31.  
  32. redirect {fd}<"${_.fifo_name}"
  33. (( _.in_fd=fd ))
  34. #printf '%s: infd=%d\n' "${_.fifo_name}" _.in_fd
  35. }
  36.  
  37. function cleanup
  38. {
  39. rm "${_.fifo_name}"
  40. }
  41. )
  42.  
  43. function main
  44. {
  45. integer i
  46. typeset name subname
  47. typeset -M toupper up
  48.  
  49. #set -x
  50.  
  51. circus_t -A ar
  52.  
  53. for name in 'a' 'b' 'c' 'd' ; do
  54. ar[${name}].cinit "fifo_${name}"
  55. done
  56.  
  57. compound -A pollfd
  58. for name in "${!ar[@]}" ; do
  59. subname="fifo_${name}_in"
  60. pollfd[${subname}]=( fd=${ar[${name}].in_fd} events=( pollin='true' pollerr='false' pollhup='false' ) revents=() )
  61. subname="fifo_${name}_out"
  62. pollfd[${subname}]=( fd=${ar[${name}].out_fd} events=( pollout='true' pollerr='false' pollhup='false' ) revents=() )
  63. done
  64.  
  65. print -v pollfd
  66.  
  67. for (( i=0 ; i < 120 ; i++ )) ; do
  68. poll -t5 pollfd || true
  69.  
  70. # print results table
  71. printf '|'
  72. for name in "${!ar[@]}" ; do
  73. up="$name"
  74.  
  75. subname="fifo_${name}_in"
  76. if ${pollfd[${subname}].revents.pollin} ; then printf '%sI+' "${up}" ; else printf '...' ; fi
  77. if ${pollfd[${subname}].revents.pollhup} ; then printf '%sIH' "${up}" ; else printf '...' ; fi
  78. if ${pollfd[${subname}].revents.pollerr} ; then printf '%sIE' "${up}" ; else printf '...' ; fi
  79. subname="fifo_${name}_out"
  80. if ${pollfd[${subname}].revents.pollout} ; then printf '%sO+' "${up}" ; else printf '...' ; fi
  81. if ${pollfd[${subname}].revents.pollhup} ; then printf '%sOH' "${up}" ; else printf '...' ; fi
  82. if ${pollfd[${subname}].revents.pollerr} ; then printf '%sOE' "${up}" ; else printf '...' ; fi
  83. printf '|'
  84. done
  85. printf '\n'
  86.  
  87. # pass token around
  88. if ${pollfd[fifo_a_in].revents.pollin} && ${pollfd[fifo_b_out].revents.pollout}; then
  89. if read -u${pollfd[fifo_a_in].fd} -N1 x ; then
  90. print -u${pollfd[fifo_b_out].fd} -f "%s" "$x"
  91. fi
  92. fi
  93. if ${pollfd[fifo_b_in].revents.pollin} && ${pollfd[fifo_c_out].revents.pollout}; then
  94. if read -u${pollfd[fifo_b_in].fd} -N1 x ; then
  95. print -u${pollfd[fifo_c_out].fd} -f "%s" "$x"
  96. fi
  97. fi
  98. if ${pollfd[fifo_c_in].revents.pollin} && ${pollfd[fifo_d_out].revents.pollout}; then
  99. if read -u${pollfd[fifo_c_in].fd} -N1 x ; then
  100. print -u${pollfd[fifo_d_out].fd} -f "%s" "$x"
  101. fi
  102. fi
  103. if ${pollfd[fifo_d_in].revents.pollin} && ${pollfd[fifo_a_out].revents.pollout}; then
  104. if read -u${pollfd[fifo_d_in].fd} -N1 x ; then
  105. print -u${pollfd[fifo_a_out].fd} -f "%s" "$x"
  106. fi
  107. fi
  108.  
  109. # fixme: send HUP around
  110.  
  111. # send start token
  112. (( i==0 )) && print -u${pollfd[fifo_a_out].fd} -f '\u[20ac]'
  113. done
  114. return 0
  115. }
  116.  
  117. set -o nounset
  118. set -o errexit
  119.  
  120. builtin mkfifo
  121. builtin poll
  122. builtin rm
  123.  
  124. main
Add Comment
Please, Sign In to add comment