你如何编写C程序来执行另一个程序?

时间:2011-03-28 14:25:45

标签: c linux

在linux中,我想编写一个启动另一个程序的C程序。程序运行时,shell将等待您输入在程序中定义的命令。此命令将启动第二个程序。

例如,假设在与调用程序相同的目录中有一个名为“hello”的简单C程序。 “hello”程序打印输出“hello,world”。将运行第一个程序,用户将输入命令“hello”。 “hello”程序将被执行并“hello,world”。将被输出到shell。

我做了一些搜索,人们建议使用“fork()”和“exec()”函数。其他人说使用“system()”。我对这些功能一无所知。我该如何调用这些功能?它们适合使用吗?

带解释的示例代码最有帮助。其他答案也欢迎。非常感谢您的帮助。

5 个答案:

答案 0 :(得分:30)

#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;
}

答案 1 :(得分:8)

如果您不熟悉fork,有关fork和exec的图形表示可能对您有所帮助。

描述fork()

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

正如您可能已经在教程中读到的那样,在调用fork()之后,会创建现有程序的副本,然后exec()将该副本替换为您传递的新程序作为论点。两个程序的两个执行单元将在fork()之后运行。

答案 2 :(得分:5)

system()不会对你足够吗?

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

答案 3 :(得分:1)

对于最简单的情况,你应该在一个目录中编译两个程序:

> ls
.
hello
second

在第二个程序中,您只需拨打system("hello");

即可

答案 4 :(得分:0)

  

我做了一些搜索,人们提出了fork()exec()功能。其他人说要使用system()。我对这些功能一无所知。我该如何调用这些功能?它们适合使用吗?

是。首先阅读文档(man页面),例如fork(2)exec(3)system(3)。很可能您使用man(1)在计算机上本地拥有该文档。请注意,system使用sh(通过bash(1)dash(1)),因为它是fork - ing,execve(2) - ing和{{3 } { - /bin/sh POSIX shell。

我认为 fork难以理解,因为成功时会返回“两次”。我不会在这里解释它(我需要很多页面)。我建议首先阅读waitpid(2) wikipage。然后,阅读一些优秀的Linux编程书籍,例如fork (system call)(可免费下载)。

另请阅读Advanced Linux ProgrammingVirtual Address Space

您还可以阅读proc(5)以获得更一般的视图。