int main() { if(fork()) { printf("i am child\n"); while(1); }else { printf("i am parent\n"); return 0; } return 0; }我父进程不是调用了 return 0么 为什么父进程不会退出
时间: 2024-03-08 14:45:17 浏览: 17
在这段代码中,父进程和子进程都会执行到最后一行`return 0;`,因为fork()函数的返回值不同,导致它们执行的语句不同。
在父进程中,fork()函数返回的是子进程的进程ID,因此它会执行if语句块中的代码,输出"i am child"并进入一个无限循环。父进程的执行流程会继续执行下去,直到执行到最后一行`return 0;`,然后退出进程。
在子进程中,fork()函数返回的是0,因此它会执行else语句块中的代码,输出"i am parent",然后退出进程。
由于父进程没有调用wait()或waitpid()函数来等待子进程结束并回收子进程的资源,所以子进程会成为僵尸进程。但是父进程不会成为孤儿进程,因为父进程在子进程退出后还会继续执行,直到自己退出。
相关问题
2、在以下程序中使用系统调用lockf()来给进程加锁,实现进程之间的互斥,观察并分析出现的现象 #include<stdio.h> main() { int p1,p2,i; while((p1==fork())==-1); if(p1==0) for(i=0;i<500;i++) printf("child%d\n",i); else {while((p2==fork())==-1); if(p2==0) for(i=0;i<500;i++) printf("son%d\n",i); else for(i=0;i<500;i++) printf("daughter%d\n",i); } }
这个程序会创建三个进程:一个父进程和两个子进程。父进程会创建两个子进程,其中一个子进程会输出"son",另一个子进程会输出"daughter",而父进程会输出"child"。这三个进程会同时运行,输出的顺序是随机的。
如果我们在程序中使用lockf()系统调用来给进程加锁,会出现如下现象:每个进程都会在执行printf()函数之前调用lockf()函数,给共享的输出资源加锁,避免多个进程同时写入。当一个进程获得了锁,其他进程就会被阻塞,直到锁被释放。这样就可以保证输出的顺序是固定的。
修改后的程序如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int p1, p2, i;
int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); // 打开一个输出文件
if (fd < 0) {
perror("open");
return -1;
}
while ((p1 = fork()) == -1);
if (p1 == 0) {
for (i = 0; i < 500; i++) {
lockf(fd, F_LOCK, 0); // 加锁
printf("child%d\n", i);
lockf(fd, F_ULOCK, 0); // 解锁
}
} else {
while ((p2 = fork()) == -1);
if (p2 == 0) {
for (i = 0; i < 500; i++) {
lockf(fd, F_LOCK, 0); // 加锁
printf("son%d\n", i);
lockf(fd, F_ULOCK, 0); // 解锁
}
} else {
for (i = 0; i < 500; i++) {
lockf(fd, F_LOCK, 0); // 加锁
printf("daughter%d\n", i);
lockf(fd, F_ULOCK, 0); // 解锁
}
}
}
close(fd);
return 0;
}
在这个修改后的程序中,我们打开了一个输出文件,并在每个进程输出前调用lockf()函数给文件加锁。这样就可以保证输出的顺序是固定的,不会出现交错的情况。
#include<stdio.h> int main() { int p1,p2,p3; long i; while((p1=fork())==-1); if(p1==0) { printf("Child1(PID=%d) is running!\n",getpid()); for(i=0;i<999999;i++); printf("Child1 is over.\n"); } else{ while((p2=fork())==-1); if(p2==0) { printf("Child2(PID=%d) is running!\n",getpid()); for(i=0; i<999999; i++); printf("Childprocess2 is over.\n"); } else{ while((p3=fork())==-1); if(p3==0) { printf("Child3(PID=%d) is running!\n",getpid()); for(i=0; i<999999; i++); printf("Child3 is over.\n"); } else{ for(i=0; i<999999; i++); printf("Parent is over.\n"); } } } return 0; }
这是一个简单的进程创建和执行的程序,该程序使用了 fork() 系统调用创建了三个子进程,每个子进程都会执行一个简单的任务,最后父进程也会执行完毕。
具体来说,当程序开始运行后,父进程会调用 fork() 创建第一个子进程 p1,如果创建失败,则会一直尝试直到成功。如果创建成功,则该子进程会输出一条消息,然后等待一段时间,再输出一条结束消息。
接着,父进程会继续执行,此时会再次调用 fork() 创建第二个子进程 p2。如果创建成功,则该子进程会输出一条消息,然后等待一段时间,再输出一条结束消息。
最后,父进程会继续执行,此时会再次调用 fork() 创建第三个子进程 p3。如果创建成功,则该子进程会输出一条消息,然后等待一段时间,再输出一条结束消息。
当所有子进程都执行完毕后,父进程会再次执行,输出一条结束消息,整个程序执行完毕。
需要注意的是,该程序中没有使用任何同步机制,因此子进程的执行顺序是不确定的,可能会出现某个子进程先于其他子进程或父进程先执行完毕的情况。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)