本地虚拟机我用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时,我不懂,他应该懂。他忘了。
我并没有仔细的去了解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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。