我试图使用execlp()以线性顺序运行多行openssl:
execlp("openssl","genrsa","-out","rsaprivatekey.pem","2048",(char*) 0);
printf("RSA private success");
execlp("openssl","rsa","-in","rsaprivatekey.pem","-pubout","-out","rsapublickey.pem",(char*) 0);
printf("RSA public success");
execlp("openssl","dgst","-sha1","-sign","rsaprivatekey.pem","-out","1.cipher","1",(char*) 0);
printf("SHA1 sign success");
execlp("openssl","dgst","-sha1","-verify","rsapublickey.pem","-signature","1.cipher","1",(char*) 0);
printf("SHA1 verify success");
在这种情况下,只执行第一行。我尝试在一个单独的execlp()中组合所有内容并使用&&分开命令但仍然没有结果。 有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
原因是“execlp()”用你想要的“exec()”替换你当前的程序。
SUGGESTIONS: 如果你想让你当前的程序持续存在(至少足够长时间来调用“openssl”的多个实例),那么使用类似“system()”而不是“execlp”的东西。
否则,请考虑使用shell脚本或.bat文件来调用多个命令,然后“execlp”您的脚本(使用相应的“bash”或“cmd.exe”)。
答案 1 :(得分:1)
如前所述,只执行第一个命令的原因是exec()
函数族的任何成员在成功时都不会返回 - 只有在失败时才会返回。
如果您希望按顺序执行操作,那么使用system()
(如已建议的那样)是最简单的机制。如果您想要并行,或者您需要更多地控制I / O重定向,那么您需要构建fork()
机制。
每次成功调用fork()
时,它都会返回两次 - 一次在父进程中,一次在子进程中。否则这些非常接近相同;主要区别在于PID和PPID(进程ID和父PID)。在孩子中,fork()
返回零;因此,您可以检测到您的进程应该运行相关命令。在父级中,fork()
返回新子进程的PID,可以将其保存以供以后与wait()
或waitpid()
一起使用,并指示父级应继续其工作(对于例如,为其他步骤产生更多的孩子。)