1

我有一个可以在服务器或客户端模式下运行的二进制文件。它可以这样使用:

$ ./a.out --server &
$ ./a.out --client &

他们互相交谈,这运作良好。我的问题是启动服务器时的预期行为是什么:

$ ./a.out --server &

但后来我忘了杀掉它,开始我的开发工作,编辑和构建,运行客户端:

$ edit client.c
$ make
$ ./a.out --client
^C
<repeat>

现在没有设置粘性位,我的操作系统(Ubuntu)是否运行两个不同版本的二进制文件?或者它是走捷径并使用内存中的实例,因此忽略了我的最新版本?这个错误还有其他副作用吗?

4

2 回答 2

2

make通过删除原始文件替换可执行文件。但是,由于它是在后台执行的,所以有对它的引用。在清除引用之前,该文件不会被完全删除(尽管目录条目已被清除以便为新的可执行文件让路)。

因此,在您的示例中,有两个版本的程序正在运行。一个副作用是,如果您进行的更改会导致您的服务器和客户端代码严重不兼容 - 例如数据包结构的更改。您可能会看到奇怪的、无法解释的行为、崩溃等。终止后台服务器并重新运行整个测试总是一个好主意。

于 2013-07-05T15:59:52.710 回答
1

如果您不更改服务器代码,只需将您的 a.out 复制到“my_server”中,例如然后将其作为 my_server --server 运行。make 将替换 a.out,但不会替换 my_server。

另一种方法 - 告诉 make 在重新编译之前杀死所有正在运行的 a.out-s:添加目标 'all'(它必须是 makefile 中的第一个),这取决于 a.out 并执行 'killall a.out'。

于 2013-07-06T17:44:11.437 回答