2011-07-22 38 views
1

我試圖運行以線性順序()的OpenSSL多行使用execlp:如何在C中運行多個execlp()?

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()中,並使用& &來分隔命令,但仍然沒有結果。 有人可以幫我解決這個問題嗎?

回答

3

原因是「execlp()」用你想要的「exec()」替換你當前的程序。

建議: 如果你希望你的當前程序將持續(至少足夠長的時間來調用爲「OpenSSL」的多個實例,然後使用類似「系統()」而不是「execlp」

否則,考慮使用shell腳本或.bat文件來調用多個命令,然後改爲使用「execlp」腳本(使用適當的「bash」或「cmd.exe」)來代替。

+0

謝謝!那就是訣竅。 – drum

+0

標準模式是一個'fork(2)',後面是'exec(2)',而不是'system(3)',用於產生子進程。 –

1

如前所述,執行第一個命令是,exec()函數系列的任何成員在成功時都不會返回 - 僅在失敗時返回。

如果您希望按順序完成操作,則使用system()(如已經建議的)是最簡單的機制。如果你想要並行性,或者你需要更多的I/O重定向控制,那麼你需要建立在fork()機制上。

每次成功調用fork()時,都會返回兩次 - 一次在父進程中,一次在子進程中。這些非常接近相同;主要區別在於PID和PPID(進程ID和父PID)。在小孩,fork()返回零;您因此可以檢測到您的過程應該運行相關的命令。在父親中,fork()返回新子進程的PID,可以將其保存以供稍後與wait()waitpid()一起使用,並指出父進程應繼續其工作(例如,爲其他步驟產生更多子進程)。