我有一个可以在服务器或客户端模式下运行的二进制文件。它可以像这样使用:
$ ./a.out --server &
$ ./a.out --client &
他们互相交谈,这很有效。我的问题是启动服务器时的预期行为是什么:
$ ./a.out --server &
但后来我忘了杀了它,继续我的开发工作,编辑和构建,以及运行客户端:
$ edit client.c
$ make
$ ./a.out --client
^C
<repeat>
现在没有设置粘贴位,是我的操作系统(Ubuntu)运行我的二进制文件的两个不同版本?或者它是采用快捷方式并使用内存中的实例,因此忽略了我的最新版本?这个错误还有其他副作用吗?
答案 0 :(得分:2)
make
通过删除原始文件来替换可执行文件。但是,由于它在后台执行,因此可以引用它。在清除引用之前,文件不会被完全删除(尽管目录条目被清除以便为新的可执行文件腾出空间)。
因此,在您的示例中,有两个版本的程序正在运行。一个副作用是,如果您进行了更改,导致服务器和服务器之间出现严重不兼容的情况。客户端代码 - 例如数据包结构的更改。您可能会看到奇怪的,无法解释的行为,崩溃等。杀死后台服务器并重新运行整个测试总是一个好主意。
答案 1 :(得分:1)
如果您不更改服务器代码,只需将a.out复制到“my_server”,例如然后将其作为my_server --server运行。 make将替换a.out,但不替换my_server。
另一种方法 - 告诉make在重新编译之前杀死所有正在运行的a.out-s:添加目标'all'(它必须是makefile中的第一个),这取决于a.out并执行'killall a.out'。