C-stackdump,具有多个fork + redirect + exec的奇怪输出

问题描述 投票:0回答:1

我有一个C程序(我们称其为[progam1])以及3个输入文件(例如"in1.txt", "in2.txt", in3.txt")和3个最初为空的输出文件("out1, "out2","out3"),它们表示对各种多边形进行的操作。

progam1::main开始,我调用fork 3次,在每个子进程中,我使用dup2将标准输入/输出重定向到输入/输出文件之一,然后调用execve(“ helper”,。 。),其中helper是另一个解析输入,进行一些计算并输出输出的C程序。

我似乎无法解决的问题是,每当我多次调用execve(helper,...)时,第一个调用就可以正常工作(输入/输出符合我的期望),但是随后出了点问题;我似乎要么以文件helper.exe.stackdump结尾,要么系统不断将相同的数据打印到输出文件,或者出现其他一些意外结果。

[作为实验,我编写了另一个C程序-"simpleWrite.c",它只是将输入复制到输出中。我正在使用cygwin运行所有这些程序。

  • 如果我将simpleWrite传递给execve中的所有3个program1呼叫,然后一切正常(将所有3个重定向的输入都复制到3个输出文件符合预期)。

  • 如果我将simpleWrite传递给一个孩子(例如第3个孩子)并从终端运行./program1,则系统完成,第1个和第3个子进程按预期工作。第二个输出为空,最后我的目录中有一个文件"helper.exe.stackdump"

  • 如果我仅将helper传递给所有3个子执行程序,并从终端运行./program1,则系统将永远无法完成。当我检查输出文件时,一个输出符合预期,一个输出为空,并且一个输出无限次打印正确的数据。

任何人都可以解释可能发生的事情吗??或说明什么是stackdump文件以及如何检查它,或者建议如何解决此问题?

这里是我代码的大致概念:

//program1.c
#define INPUT1 "in1.txt" 
#definte OUTPUT1 "out1.txt" 
// same for rest of input/output files

char* my_argv[2];

int main(int argc, char* argv[])
{
    char prog_name[20] = "helper";
    char prog_name2[20] = "simpleWrite";

    my_argv[0] = "helper";
    my_argv[1] = NULL;


    pid_t   pid1, pid2, pid3, pid;
    int     status;

     if ((pid1 = fork()) < 0) {
          printf("Failed to fork process 1\n");
          exit(1);
     }
     else if (pid1 == 0)
     {
         // redirection here for the child only
        int fd_in = open_file_desc(INPUT1);
        int fd_out = open_file_desc(OUTPUT1);

        dup2(fd_in, 0);
        dup2(fd_out,1);

        close(fd_in); 
        close(fd_out);

        execve(prog_name, my_argv, NULL);
        //alternately, execve(prog_name2, my_argv, NULL);
     }

     if ((pid2 = fork()) < 0) {
          //...
     }
     else if (pid2 == 0) 
     {
        int fd_in2 = open_file_desc(INPUT2);
        int fd_out2 = open_file_desc(OUTPUT2);
        ...// same idea as above
     }

     // likewise for pid3 
     ...

     //back in parent process
     pid = wait(&status);
     printf("\n***Parent detects process %d was terminated ***\n", pid);
     pid = wait(&status);
     printf("\n*** Parent detects process %d was terminated ***\n", pid);
     pid = wait(&status);
     printf("\n*** Parent detects process %d was terminated ***\n", pid);

    // dup2(sav_stdin, 0);
    // dup2(sav_stdout, 1);
    // dup2(sav_stderr, 2);
    exit(0);
}
//helper.c
enum POLYGON { HEXAGON = 6, HEPTAGON = 7, OCTAGON = 8 };

struct point {
    short *X, *Y;
};

struct polygon
{
    enum POLYGON type;
    struct point points;
};

struct Node {
    struct polygon* poly;
    struct Node* next;
};

struct Node *HEAD = NULL;
struct Node *TAIL = NULL;

int main()
{
    int lastCommand = 0, polygonscreated =0, newPolygonBit;
    //other variables needed for parsing/calculations

    while (!lastCommand)
    {
        scanf("%llx", &input);
        //parsing stuff

        if (newPolygonBit == 1)
        {
            polygonscreated = polygonscreated+1;
            scanf("%llx", &setOfPoints1);
            scanf("%llx", &setOfPoints2);
            struct polygon* polyptr = createPolygon(polyType, setOfPoints1, setOfPoints2);

            func[ADD_POLYGON](polyptr);
        }

        lastCommand = input & 1;
    }

    freeList(HEAD);
    printf("Created %d polygons", polygonscreated);
    return polygonscreated;
}
//simpleWrite.c
int main()
{
    char c;

    while( read(0, &c, 1) > 0){ 
      write(1, &c,1); 
    }
  return 0;
}
c operating-system fork exec io-redirection
1个回答
0
投票

我在使用类似的代码时遇到了类似的问题。

我的问题是我希望我的子进程按特定顺序执行。在这种情况下,假设您希望您的3个孩子按以下步骤执行:-儿童A-儿童B-儿童C

但是调度程序可能以不同的顺序执行它们。比方说A-C-B。

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.