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

2024-11-14 08:29:00
admin
原创
122
摘要:问题描述:在 Linux 中,我想编写一个启动另一个程序的 C 程序。当程序运行时,shell 将等待您输入您在程序中定义的命令。此命令将启动第二个程序。例如,假设在调用程序所在的目录中有一个名为“hello”的简单 C 程序。“hello”程序打印输出“hello, world”。第一个程序将运行,用户将输...

问题描述:

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

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

我搜索了一下,有人建议使用“fork()”和“exec()”函数。其他人建议使用“system()”。我不了解这些函数。我该如何调用这些函数?它们适合使用吗?

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


解决方案 1:

#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:

如果你是 fork 新手,那么有关 fork 和 exec 的图形表示可能会对你有帮助。

描述fork()

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

您可能已经在教程中读到过,调用后fork()会创建现有程序的副本,之后exec()会用您作为参数传递给它的新程序替换该副本。之后将运行两个程序的两个执行单元fork()

解决方案 3:

对你来说还不够吗system()

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

解决方案 4:

我搜索了一下,有人建议使用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/shPOSIX shell。

我认为这fork很难理解,因为成功时它会返回“两次”。我不会在这里解释它(我需要很多页才能解释)。我建议首先阅读fork(系统调用) wikipage。然后,阅读一些好的 Linux 编程书籍,例如《高级 Linux 编程》(可免费下载)。

另请阅读有关虚拟地址空间和proc(5)的内容。

您还可以阅读《操作系统:三个简单的部分》以获得更全面的了解。

解决方案 5:

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

> ls
.
hello
second

在第二个程序中你只需要调用system("hello");

解决方案 6:

您的问题的答案取决于您是否要在执行第二个(或子)程序后在父程序中执行其他语句。

如果您想在执行第二个(或子)程序后在父程序中执行其他语句,我会使用system()

如果在执行第二个(或子)程序后不需要从父程序执行其他语句,我只需使用execv()。不会创建第二个进程。父程序将终止,第二个程序将使用与父程序相同的进程 ID 运行。

PS 在这种情况下,您也可以使用system()。但是,如果使用system(),则会创建两个具有不同进程 ID 的进程 - 一个进程 ID 用于主程序,另一个进程 ID 用于第二个程序。

在您的示例中,您可以使用system()函数或execv()函数。

这是一个简单的、不言自明的示例system()

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello from the parent process
");

    if ( system("echo 'Hello from the child process' > test.txt") != 0 )
    {
        printf("ERROR executing system() command
");
    }

    if ( system("cat test.txt") != 0 )
    {
        printf("ERROR executing system() command
");
    }

    printf("Executing from the parent process again!
");
}

输出如下:

Grinchs-MBP:Downloads rob$ ./parent3
Hello from the parent process
Hello from the child process
Executing from the parent process again!

stdlib.h如果您打算使用,请记得包含头文件system()

如果您在子程序或第二个程序完成后不需要在父程序中执行其他语句,我只会execv()父程序中使用。

在这种情况下,您不需要使用 创建 fork fork()。您只需要使用execv()。如果您想使用execv(),请记住包含unistd.h头文件。

execv()被调用时,调用它的进程将被终止,并由分配的内存部分中具有相同 ID 的新进程替换。

如果execv()执行成功,则不会返回。如果返回,则是因为发生了错误。换句话说,execv()应该是您打算从父程序执行的最后一条语句,因为execv()只有在发生错误的情况下才会返回到父程序。

再说一遍——如果您想从父程序执行另一个程序,并且想在第二个(或子)程序完成后在父程序中执行其他语句,那么我会使用system()它。

这是一个使用 的简单示例execv()

父进程代码

#include  <stdio.h>
#include  <unistd.h>
#include  <errno.h>

int main ()
{
printf ("I am the parent process

");

char *arg_Ptr[4];
arg_Ptr[0] = "child.c";
arg_Ptr[1] = "Hello from the child process";
arg_Ptr[2] = "Good-Bye from the child process!";
arg_Ptr[3] = NULL;

execv("/Users/rob/Downloads/child.bin", arg_Ptr);
printf ( "Error:  %i
", errno);
}

子进程代码 (保存在 /Users/rob/Downloads/child.bin)。

#include  <stdio.h>

int main(int argc, char *argv[])
{
 printf ("I am the child process
");

 printf ("Argument 1: %s
", argv[1]);
 printf ("Argument 2: %s
", argv[2]);
 printf ("Argument 3: %s
", argv[3]); 
}

输出如下

Grinchs-MBP:Downloads rob$ ./parent 
I am the parent process

I am the child process
Argument 1: Hello from the child process
Argument 2: Good-Bye from the child process!
Argument 3: (null)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用