ssc网站建设交流群,雄安网站建设制作,福建城乡建设部网站首页,网站开发公司前端和后端开发人数比一般多少合适现实中程序编写的时候#xff0c;经常会碰到一些这样需求#xff1a;调用系统命令#xff0c;完成一些操作#xff0c;或判定结果 或获取结果作为启动进程#xff0c;调用第三方进程#xff0c;并监控进程是否退出加载升级进程#xff0c;升级进程kill调用者或调用者自行…现实中程序编写的时候经常会碰到一些这样需求调用系统命令完成一些操作或判定结果 或获取结果作为启动进程调用第三方进程并监控进程是否退出加载升级进程升级进程kill调用者或调用者自行退出完成升级网上方法也有很多种但各有差异直接调用system启动例如system(/opt/yourapp) 此时会运行yourapp的进程当然如果需要后台运行仅需后面加 如system(/opt/yourapp ) 这样system启动yourapp 不用等待退出就可执行下一步使用popen打开cmd例如 FILE *pp popen(/opt/yourapp , r);使用execl 或者 execv来加载进程如 execl(/opt/yourapp,yourapp, (char*)0);使用 posix_spawn 打开进程 char* const args[] {fullPath,appName,p1,p2,nullptr}; int res posix_spawn(pid, args[0], nullptr, nullptr, args, environ);那么这几种有什么区别或特点呢shell环境变量特点system执行异步执行开启shell不共享shell环境变量一般用于简单系统命令例如rebootpopen也可异步但一般需要获取执行结果时开启shell不共享shell环境变量一般用于命令调用结合fileread可以获取执行返回值例如 ls命令返回结果execl 或者 execv一般需要fork子进程然后创建新进程共享监控子进程。父进程不退出posix_spawn在当前环境下开启进程可带参数共享加载进程。跟父进程无关system跟popen相差不大都是重开一个shell然后运行的所以不继承父进程的shell 环境变量如果需要依赖环境变量的此时需要做调整如果进程要带参数也是可以的 直接cmd带参数即可system(/opt/yourapp -r xxxx );popen同时还会建立管道此时可根据管道获取执行的进程返回信息例如 我们执行popen(pidof yourapp)此时可以方便获取到 yourapp进程的pid号int Exec(const char *cmd, vectorstring res)
{res.clear();FILE *pp popen(cmd, r);if(pp nullptr){return -1;}char tmp[1024] {0};while(fgets(tmp, sizeof(tmp), pp) ! NULL){if(tmp[strlen(tmp) - 1] \n){tmp[strlen(tmp) - 1] \0;}res.push_back(string(tmp));}auto eStatus pclose(pp);if (eStatus 0){return res.size();}if (0 ! WEXITSTATUS(eStatus)){return res.size();}return res.size();
}execl 或者 execv一般跟fork一起fork本意就是复制父进程fork 函数会新生成一个进程调用 fork 函数的进程为父进程新生成的进程为子进程。在父进程中返回子进程的 pid在子进程中返回 0失败返回-1。系统先给新的进程分配资源例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中只有少数值与原来的进程的值不同。相当于克隆了一个自己。这样做的坏处就是过分依赖父进程如果是兄弟进程就不好用这种方式加载了posix_spawn是比较好解决兄弟进程也就是A进程 posix_spawn B进程通用B进程也可以 posix_spawn A进程相互之间不干扰