for (int i=0; i<2; i++) { fork(); }
时间: 2023-12-06 11:05:06 浏览: 13
这段代码会创建一个父进程和两个子进程,每个子进程会继续创建自己的子进程,最终会创建出一个进程树。具体地,第一次调用 `fork()` 会创建一个子进程,此时有两个进程,然后在每个子进程中再次调用 `fork()`,就会各自再创建一个子进程,这样就有了四个进程。因为进程是树状结构,所以最终一共有 2^2=4 个进程。
相关问题
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 <unistd.h> int main() { for(int i = 0; i < 100; i++) { fork(); } return 0; }
这段代码的作用是创建了一个简单的进程树。循环100次,每次调用fork()函数创建一个新的子进程。因此,第一次循环创建了一个子进程,第二次循环创建了两个子进程,第三次循环创建了四个子进程,以此类推,直到创建了100个子进程。每个子进程都是父进程的副本,但是它们有不同的进程ID和不同的父进程ID。最终,该程序将共创建2的100次方个进程,这是一个非常大的数,可能会导致系统崩溃或变得不稳定。因此,不推荐使用这种方式创建进程。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)