[英]How do you write a C program to execute another program?
在linux中,我想编写一个启动另一个程序的C程序。 程序运行时,shell将等待您输入在程序中定义的命令。 此命令将启动第二个程序。
例如,假设在与调用程序相同的目录中有一个名为“hello”的简单C程序。 “hello”程序打印输出“hello,world”。 将运行第一个程序,用户将输入命令“hello”。 “hello”程序将被执行并“hello,world”。 将输出到shell。
我做了一些搜索,人们建议使用“fork()”和“exec()”函数。 其他人说使用“system()”。 我对这些功能一无所知。 我该如何调用这些功能? 它们适合使用吗?
带解释的示例代码最有帮助。 其他答案也欢迎。 非常感谢您的帮助。
#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;
}
如果您不熟悉fork,有关fork和exec的图形表示可能对您有所帮助。
fork()
描述
+-------------+
|main program |
+-------------+ (fork())
|___________________________
+-------------+ |
|main program | +-------------+
+-------------+ |main program |
| +-------------+
+-------------+ | (exec())
|main program | +-------------+
+-------------+ |hello program|
+-------------+
正如您可能已经在教程中读到的那样,在调用fork()
之后,会创建现有程序的副本,然后exec()
将该副本替换为新程序,并将其作为参数传递给它。 fork()
之后将运行两个程序的两个执行单元。
system()
不适合你吗?
/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */
对于最简单的情况,您应该在一个目录中编译两个程序:
> ls
.
hello
second
在第二个程序中,您只需要调用system("hello");
我做了一些搜索,人们建议使用
fork()
和exec()
函数。 其他人说使用system()
。 我对这些功能一无所知。 我该如何调用这些功能? 它们适合使用吗?
是。 首先阅读文档( man
页),例如fork(2) , exec(3) , system(3) 。 很可能你在计算机上本地拥有该文档,使用man(1) 。 请注意, system
使用sh
(通过bash(1)或dash(1) ),因为它是fork
-ing, execve(2) -ing和waitpid(2) -ing /bin/sh
POSIX shell。
我认为fork
很难理解,因为成功后它会返回“两次”。 我不会在这里解释它(我需要很多页面)。 我建议首先阅读fork(系统调用) wikipage。 然后,阅读一些优秀的Linux编程书籍,例如Advanced Linux Programming (可免费下载)。
您还可以阅读操作系统:三个简单的部分,以获得更一般的视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.