球拍中的子进程

时间:2012-02-11 21:54:25

标签: subprocess stdout racket

我正在编写一个需要进程间通信的程序。

我的代码:

#lang racket

(define-values (sp o i e) (subprocess #f #f #f "c://player1.exe" ))
(define count 10)

(for ([c (in-naturals)])
  (cond
    [(equal? count 0) (error "Province is empty!") ] 
    [else 
     (write "server" i)
     (set! count (sub1 count))
     (flush-output i)
     (display (read o))]))

和player1.exe代码:

#lang racket
(define (interact notification)
  (cond
    [(eq? notification "server") (write "true" (current-output-port))]
    [else (write "false" (current-output-port))]))

(for ([c (in-naturals)])
  (interact (read (current-input-port)))
  (write "player" (current-output-port))
  (sleep 0.1)

  flush-output (current-output-port))

如果我没有循环运行,我会得到输出。当只有玩家发送消息时,我也得到输出。但是,如果服务器和播放器都发送消息,程序就会被挂起。 您认为问题是什么?

1 个答案:

答案 0 :(得分:4)

player1.exe文件中的最后一行看起来很可疑。 flush-output实际上并未作为函数应用。而不是

flush-output (current-output-port)
你可能意味着:

(flush-output (current-output-port))

从样式的角度来看:默认情况下,函数readwriteflush-output都可以在当前输入和输出端口上工作,因此您无需提供他们。查看这些功能的文档,例如flush-output,您会看到它提到current-output-port是默认值。

所以我们刚才看到的那一行可以写成:

(flush-output)

更多问题:请勿使用eq?来比较字符串。请改用string=?。原因是可能有两个字符串具有相同的文本内容,但eq?仍然能够区分这两个字符串。 e.g:

kui $ racket
Welcome to Racket v5.2.1.
> (eq? "a" (string-copy "a"))
#f
> (string=? "a" (string-copy "a"))
#t