2011-03-28 105 views
17

在linux中,我想寫一個啓動另一個程序的C程序。程序運行時,shell將等待您輸入您在程序中定義的命令。該命令將啓動第二個程序。如何編寫一個C程序來執行另一個程序?

例如,假設在調用程序所在的目錄中有一個名爲「hello」的簡單C程序。 「hello」程序打印輸出「hello,world」。第一個程序將運行,用戶將輸入命令「hello」。 「hello」程序將被執行,並且「hello,world」。將被輸出到shell。

我已經做了一些搜索,並且人們提出了「fork()」和「exec()」函數。其他人表示使用「系統()」。我不瞭解這些功能。我如何調用這些函數?它們適合使用嗎?

具有解釋的示例代碼將最有幫助。其他答案也是受歡迎的。非常感謝您的幫助。

回答

25
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> /* for fork */ 
#include <sys/types.h> /* for pid_t */ 
#include <sys/wait.h> /* for wait */ 

int main() 
{ 
    /*Spawn a child to run the program.*/ 
    pid_t pid=fork(); 
    if (pid==0) { /* child process */ 
     static char *argv[]={"echo","Foo is my name.",NULL}; 
     execv("/bin/echo",argv); 
     exit(127); /* only if execv fails */ 
    } 
    else { /* pid!=0; parent process */ 
     waitpid(pid,0,0); /* wait for child to exit */ 
    } 
    return 0; 
} 
+2

+1更靈活的解決方案 – 2011-03-28 14:32:33

+0

爲什麼'argv'變量和'execv'調用中的'echo'? – User 2016-10-05 19:43:03

+0

@用戶,因爲它是argv [0],即*程序名*。 – 0andriy 2017-01-09 23:57:36

3

不會system()夠嗎?

/* ... */ 
if (!strcmp(cmd, "hello")) system("hello.exe"); 
/* ... */ 
+1

它的Linux,所以很可能沒有發現EXE。雖然,它可以是任何名字。 – 2011-03-28 14:30:39

+1

系統是''函數,它可以在unix上運行。 – vissi 2011-03-28 14:32:18

+0

@Vladimir:OP聲明程序是「hello.c」。這很可能不是 - 我只是想指出他正確的方向,當他嘗試我的片段:) – pmg 2011-03-28 14:33:29

1

對於最簡單的情況下,你應該在一個目錄中的兩個已編譯的程序:

> ls 
. 
hello 
second 

在第二個程序,你只需要調用system("hello");

+2

事情在* nix環境中無法如此。系統(...)調用一個shell(實際上是/ bin/sh),它將在搜索路徑中查找可執行文件($ PATH環境變量)。由於出於安全原因不應將工作目錄(./)放在PATH中,因此將被調用程序放在與調用者相同的目錄中將無法工作。這與工作目錄包含在搜索中的Windows不同。 – datenwolf 2011-03-28 16:59:04

+0

這適用於我(用於調用可執行文件)。 – 2015-10-23 17:57:20

6

如果你是新的叉,圖形表示關於fork和exec可能對你有所幫助。

fork()

+-------------+ 
    |main program | 
    +-------------+ (fork()) 
     |___________________________ 
    +-------------+     | 
    |main program |   +-------------+ 
    +-------------+   |main program | 
     |     +-------------+ 
    +-------------+     |  (exec()) 
    |main program |   +-------------+ 
    +-------------+   |hello program| 
          +-------------+ 

描寫正如你可能已經閱讀教程,呼籲fork()創建現有程序的副本後,與exec()後替換該副本新程序,你將它作爲參數傳遞給它。兩個程序的兩個執行單元將在fork()之後運行。

0

我已經做了一些搜索,人們建議fork()exec()功能。其他人表示使用system()。我不瞭解這些功能。我如何調用這些函數?它們適合使用嗎?

是的。先閱讀文檔(man頁),例如fork(2)exec(3)system(3)。很可能你在電腦上使用man(1)本地文件。請注意,使用systemsh(直通bash(1)dash(1)),因爲它是fork -ing,execve(2) -ing和waitpid(2) -ing的/bin/sh POSIX殼。

我認爲fork很難理解因爲成功它返回「兩次」。我不會在這裏解釋它(我需要很多頁面)。我建議先閱讀fork (system call) wikipage。然後,閱讀一些很好的Linux編程書,g Advanced Linux Programming(可免費下載)。另外請參閱Virtual Address Spaceproc(5)

您也可以閱讀Operating Systems: Three Easy Pieces以獲得更一般的視圖。

相關問題