在linux中,我想编写一个启动另一个程序的C程序。程序运行时,shell将等待您输入在程序中定义的命令。此命令将启动第二个程序。
例如,假设在与调用程序相同的目录中有一个名为“hello”的简单C程序。 “hello”程序打印输出“hello,world”。将运行第一个程序,用户将输入命令“hello”。 “hello”程序将被执行并“hello,world”。将被输出到shell。
我做了一些搜索,人们建议使用“fork()”和“exec()”函数。其他人说使用“system()”。我对这些功能一无所知。我该如何调用这些功能?它们适合使用吗?
带解释的示例代码最有帮助。其他答案也欢迎。非常感谢您的帮助。
答案 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 Programming和Virtual Address Space。
您还可以阅读proc(5)以获得更一般的视图。