代码解释 - fork,wait,execv

时间:2014-03-07 04:47:44

标签: c linux fork wait

我正在尝试理解以下代码的作用:

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

int main(void) {
    int pid;

    for(;;) {
        pid = fork();
        printf(getpid());

        if(pid == -1) {
            printf("fork failed");
            exit(1);
        }

        if(pid == 0) {
            execv("MYFORKAPP", NULL);
            exit(2);
        }

        wait();
    }
return 0;
}

程序本身称为MYFORKAPP。我正在学习这三个功能,我在互联网上看到了这个代码,我不明白它的作用。

我试图运行它(Fedora GCC),但终端是空的。

是否至少要打印第一个getpid()

你能解释一下这段代码吗?

2 个答案:

答案 0 :(得分:2)

printf(getpid());

这可能导致程序崩溃。 printf()期望它的第一个参数是一个字符串,但getpid()将返回一个整数,所以这个整数将用作指向字符数组的指针,这很可能导致崩溃,即分段错误

除此之外,该程序的作用是

  1. fork()子进程和wait()
  2. 此子进程将再次执行相同的程序
  3. 所以它会fork()wait()
  4. 等等,直到您的系统没有足够的资源来创建新流程
  5. 然后fork()将失败,这些不同级别的子进程将逐个退出
  6. 最后,shell创建的第一个进程将退出,程序结束。

答案 1 :(得分:0)

以下代码的作用 - 分段错误。
必须是:

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

int main(void) {
    int pid;

    for(;;) {
        pid = fork();

        if(pid == -1) {
            printf("fork failed");
            exit(1);
        }

        if(pid == 0) {
            printf("child has pid %d\n", getpid());
            execv("MYFORKAPP", NULL);
            exit(2);
        }

        wait();
    }
return 0;
}

这是一个循环:
1.父母创建子进程。
2.孩子们转向MYFORKAPP 3.家长等待孩子的过程 4.孩子终止(可能) 5.转到1