当前位置: 首页 > 面试题库 >

系统调用fork()和execv函数

冀望
2023-03-14
问题内容

我正在尝试使用此C代码连续运行两个可执行文件:

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

int main (int argc, char *argv[])
{
    fork();
    execv("./prcs1", &argv[1]); // GIVE ADDRESS OF 2nd element as starting point to skip source.txt
    fork();
    execv("./prcs2", argv);
    printf("EXECV Failed\n");
}

尽管有分叉,但在第一个execv()调用之后,程序将退出,它永远不会到达第二个execv()。我试过在第一次fork之后调用wait(),但是我不确定那是缺少的内容。

有什么想法为什么在孩子退出后控制权不返回给父母?


问题答案:

你有几个问题。首先,如果只想运行两个程序,则只需调用fork()一次。然后在父进程中运行一个程序,在子进程中运行一个程序。其次,您正在构造argvexecv错误地传递给的数组。第一个条目应该是可执行文件名称。做类似的事情:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    pid_t i = fork();
    if (i == 0)
    {
        execv("./prcs1", (char *[]){ "./prcs1", argv[1], NULL });
        _exit(1);
    }
    else if (i > 0)
    {
        execv("./prcs2", (char *[]){ "./prcs2", argv[0], NULL });
        _exit(2);
    }
    else
    {
        perror("fork failed");
        _exit(3);
    }
}

请注意,此示例不进行错误检查。



 类似资料:
  • 问题内容: 我目前正在学习,并且对组合的效率存在疑问。 向我显示了以下标准代码: 我知道这会克隆整个过程(复制整个堆等),并用新程序替换当前地址空间。考虑到这一点,使用该组合是否会导致效率低下?我们正在复制进程的整个地址空间,然后立即覆盖它。 所以我的问题是: 即使我们浪费了,使用此组合(而不是其他解决方案)有什么好处呢? 问题答案: 使用此组合(而不是其他解决方案)有什么好处,即使我们有浪费,该

  • 问题内容: 这是我使用2 fork()系统一个接一个地调用的代码-它实际上如何工作? 我得到的输出为: 0。我是进程27701 1. 我是进程25915 1.我是 进程27701 2.我是进程27781 2.我是进程26170 2.我是进程27701 这是我使用3个fork系统调用的下一个程序,如何获得这样的输出? 如果我要手动解决此代码,那么逻辑是什么? 在这里,我得到的输出为: 0。我是进程2

  • 系命名规范 系统类库位于系统的phpcms/libs/classes目录下面,函数库文件名为*.class.php,其中global.func.php为框架中默认加载,global.func.php中函数可直接使用 系统函数库位于系统的phpcms/libs/functions目录下面,函数库文件名为*.func.php 系统类库调用  /** * 加载系统类方法 * @param strin

  • 本章描述 Linux 内核中的系统调用概念。 系统调用概念简介 - 介绍 Linux 内核中的系统调用概念 Linux 内核如何处理系统调用 - 介绍 Linux 内核如何处理来自于用户空间应用的系统调用。 vsyscall and vDSO - 介绍 vsyscall 和 vDSO 概念。 Linux 内核如何运行程序 - 介绍一个程序的启动过程。 open 系统调用的实现 - 介绍 open

  • 系统调用sendfile Sendfile是Linux实现的系统调用,可以通过避免文件在内核态和用户态的拷贝来优化文件传输的效率。 其中大名鼎鼎的分布式消息队列服务Kafka就使用sendfile来优化效率,具体用法可参见其官方文档。 优化策略 在普通进程中,要从磁盘拷贝数据到网络,其实是需要通过系统调用,进程也会反复在用户态和内核态切换,频繁的数据传输在此有效率问题。因此我们必须意识到Linux

  • 系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相