不理解这个fork/exec类型的程序。我不明白 B 如何被打印两次

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

下面是prog1程序的代码。假设程序执行成功,除非查询明确指出其他情况。 这是代码:

    int main(int argc,char *argv[]){
        int i;
        for(i=1;i<3;i++){
            if (fork()==0){
                printf("A");
                execvp("./prog2",&argv[1]);
                printf("B");
                exit(1);
            } 
            printf("C");
        
        }
        printf("D");
        return 0;
    }

我们编写命令./prog1 字母 A、B、C、D 各打印多少次?

我的想法是:(初始)过程将分为父进程和子进程。父进程将打印 C,而子进程将进入 if,打印 A,然后 exec 将执行进入另一个程序,因此后面的 print B 将永远不会被打印。同样,这也会发生在第二个分叉中。 Parent 打印 C child 的操作与之前相同。最后家长打印 D. 因此 A 两次,B 零次,C 两次,D 一次。 但我运行时得到的是:A两次,B两次,C三次,D一次。 有人可以解释一下吗? this is what i imagine is happening

c for-loop if-statement fork exec
1个回答
0
投票

一定是你的./prog2的execvp有问题。 这可以通过将程序更改为肯定有效的众所周知的程序来证明:

int main(int argc,char *argv[]){
        int i;
        for(i=1;i<3;i++){
            if (fork()==0){
                printf("A");
                execvp("/bin/true",&argv[1]);
                printf("B");
                exit(1);
            } 
            printf("C");
        
        }
        printf("D");
        return 0;
    }
© www.soinside.com 2019 - 2024. All rights reserved.