我正在尝试理解以下代码的作用:
#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()
?
你能解释一下这段代码吗?
答案 0 :(得分:2)
printf(getpid());
这可能导致程序崩溃。 printf()
期望它的第一个参数是一个字符串,但getpid()
将返回一个整数,所以这个整数将用作指向字符数组的指针,这很可能导致崩溃,即分段错误
除此之外,该程序的作用是
fork()
子进程和wait()
fork()
和wait()
fork()
将失败,这些不同级别的子进程将逐个退出答案 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