我正在调试一个必须与其他组件一起运行的应用程序。我将所有内容包装在一个脚本中:
#!/bin/bash
./component1 > 1.log &
./my_application &
./component2 > 2.log &
我想在终端中看到输出,所以我没有重定向输出my_application
。
结果是my_application
出现了段错误。但奇怪的是,抱怨段错误信息的输出行没有在我的终端中打印出来。最后一行根本就不见了。
如果我./my_appliation
在另一个终端中单独运行,则输出正常。我看到最后一行“分段错误”
当我使用 & 运行应用程序时,为什么输出会丢失? 如果我在命令末尾添加 & 会有什么不同?
答案1
消息“段错误”实际上不是从写的,./my_applitation
而是从 shell 发出的。
当您&
在命令后使用时,shell 将在子shell 中在后台运行它,我认为该子shell 的 stderr 输出就是丢失的内容。
我在这里确认了同样的事情:
$ cat >segf.c <<EOF
int main(int argc, char *argv[]){
char *p;
p=0;
printf("%d", *p);
}
EOF
$ make segf
$ bash -c "./segf"
Segmentation fault
$ bash -c "./segf &"
$
答案2
可能是因为您的脚本中 ./component1, ./my_application, ./component2 同时执行,如果它们使用您系统中相同的文件或设备,则可能会出现段错误。