【问题标题】:How to use multiple forks in one program如何在一个程序中使用多个分叉
【发布时间】:2020-09-17 20:05:54
【问题描述】:

我显然无法熨平叉子。我有代码,我在早期使用以下技术没有问题,但后来它会导致可怕的递归错误,所以很明显我对分叉的理解有些偏离。不管我把这些放在什么顺序,只有第一个会执行,第二个显然什么都不做。如果有人能解释原因,或者甚至只是指出如何使用这样的多个分叉的示例,我将不胜感激

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){ 
    int DD, EE;
    char *arg[0];

    
    
    
    EE=fork();
    if (EE==0) 
        execv("EE",arg);

    DD=fork();
    if (DD==0) 
        execv("DD",arg);
    
    exit(0);
}

编辑:我使用 GDB 并在 DD=fork(); 行之前将跟随模式设置为 child,并且 DD 是子进程(0)中的正确值,但是当我跨过 execv 行时没有发生任何事情。很混乱

【问题讨论】:

  • 在我看来,传递给execv() 的参数是一个未初始化的数组。我认为,至少,arg 需要包含至少两个条目,第一个通常与可执行文件名匹配,第二个是 NULL
  • 您期望发生什么? Execv 用您传递的参数替换当前进程的图像。 ./EE 是做什么的?
  • @TonyTannous 两个文件都将内容打印到 cmd,但如果相关,DD 会执行一个 linux 命令来执行此操作(ps -u [我的用户名])
  • char *arg[0]; 是大小为零的数组的定义。这不是合法的 C
  • @KevinBoone 语法是 execv(char * programName, char * arguments[]。我会尝试添加一个 NULL,但如果这是问题,我会非常惊喜

标签: c process fork


【解决方案1】:

C 不支持零长度数组,所以如果这个 ...

    char *arg[0];

... 编译,那么这仅仅是因为您正在执行由您的特定 C 实现提供的语言扩展。无论如何,你在这里没有用,因为execv() 的第二个参数必须指向一个以 null 结尾的参数数组的第一个元素,其中至少包含一个参数(按照惯例,它是程序)。 arg 至少需要两个元素来容纳它加上空指针终止符。

当我跨过 execv 行时什么也没发生

不,发生了未定义的行为。我推测execv() 失败,可能是因为参数列表错误,因为您没有检查返回值,所以您很难注意到它。据推测,如果 exec 失败,您希望通过_Exit()ing 退出具有非零退出状态的(子)进程来中止。无论如何,这将是通常的做法。

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2021-05-31
    • 2012-04-19
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多