如何在C中运行多个execlp()?

时间:2011-07-22 04:49:51

标签: c openssl exec

我试图使用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()中组合所有内容并使用&&分开命令但仍然没有结果。 有人可以帮我解决这个问题吗?

2 个答案:

答案 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()一起使用,并指示父级应继续其工作(对于例如,为其他步骤产生更多的孩子。)