本地虚拟机我用ubuntu很嗨,但线上一般都是centos。
同事写了一个程序,输入格式是programName {A,B,C}
因为之前参数只有一个时,programName {A}会挂死,还非得programName {A,}
所以我打心里认为输入处理他自己完成的。
我这边的程序会调用同事的程序,在线上跑没出过问题。
在本地跑的时候,调用同事的程序,同事的程序挂死。
就把同事的程序当作黑盒吧。就只知道会挂死。调用同事程序时会打印参数,该参数正常。
但是同一个程序加相同参数在命令行执行没有问题,在程序里调用时,挂死。
就我在程序里执行命令行用system,或者execv,厉害的还用popen。execv当时有坑,因为需要自己设置argv,所以这个坑我大概见过。
当我脱离程序,关键语句另写了个c程序,在ubuntu上跑错误,在centos上跑正确,差不多这个问题就定位出来了。
ubuntu默认脚本执行程序dash,centos默认bash。
{A,B,C}参数列表并不由同事程序解析,而是脚本解释器解析。所以同事的程序就是黑盒。因为当时gdb打印argv[1]出来{A,B,C}而不是A时,我不懂,他应该懂。他忘了。
之后设置ubuntu默认脚本解释器为bash,问题解决。
我并没有仔细的去了解dash和bash,但ubuntu这样做的原因是,dash更快。
#include <stdio.h> #include <stdlib.h> int main() { char cmd[] = "programName {A,B,C}"; char buf[5000]; system(cmd); FILE *fp = popen(cmd, "r"); int ret; if (fp) { ret = fread(buf, 1, 4999, fp); pclose(fp); } printf("%s\n", buf); return 0; }