编写一段程序,使用系统调用fork ( )创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“p";子进程分别显示字符“s”和字符“d”。
时间: 2023-06-01 16:02:08 浏览: 92
```
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 < 0) {
printf("fork error\n");
return 1;
} else if (pid1 == 0) {
// 子进程1
printf("s\n");
} else {
// 父进程
pid2 = fork();
if (pid2 < 0) {
printf("fork error\n");
return 1;
} else if (pid2 == 0) {
// 子进程2
printf("d\n");
} else {
// 父进程
printf("p\n");
}
}
return 0;
}
```
相关问题
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动,让
在Unix/Linux操作系统中,`fork()`函数是一个关键的系统调用,用于创建新的进程。以下是一个简单的C语言程序示例,它演示了如何使用`fork()`创建两个子进程:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define MAX_CHILDREN 2
int main() {
pid_t pid; // 子进程ID
int i;
if (fork()) { // 父进程
for (i = 0; i < MAX_CHILDREN; i++) {
printf("Parent process (PID: %d) is waiting for child %d...\n", getpid(), i+1);
wait(NULL); // 等待子进程结束
}
printf("All children completed. Parent process exiting.\n");
return 0;
} else { // 子进程
printf("Child process (PID: %d) started.\n", getpid());
// 这里可以添加子进程特有的任务,比如执行某个操作
sleep(1); // 暂停1秒,只是为了展示子进程独立运行
printf("Child process %d exiting.\n", getpid());
_exit(0); // 代替exit(),因为父进程不会继续执行
}
return 0; // 这将永远不会到达,因为在子进程中使用了_exit()
}
```
在这个程序中,主函数首先调用`fork()`。如果返回值大于0,那么当前进程成为父进程,并等待所有子进程完成;如果返回值等于0,则当前进程变成子进程,执行一些特定的任务并最终通过`_exit()`结束。
运行这个程序会看到一个父进程和两个子进程,每个子进程在结束前暂停了一秒。
编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程并发执行,观察实验结果并分析原因。
以下是一个使用 `fork()` 系统调用创建两个子进程的程序示例:
```c
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 == 0) {
printf("Child process 1, pid=%d\n", getpid());
} else if (pid1 > 0) {
pid2 = fork();
if (pid2 == 0) {
printf("Child process 2, pid=%d\n", getpid());
} else if (pid2 > 0) {
printf("Parent process, pid=%d\n", getpid());
} else {
fprintf(stderr, "Error: fork() failed\n");
return 1;
}
} else {
fprintf(stderr, "Error: fork() failed\n");
return 1;
}
return 0;
}
```
在该程序中,首先使用 `fork()` 创建了一个子进程 `pid1`,然后在父进程中再次调用 `fork()` 创建了另一个子进程 `pid2`。这样,就有一个父进程和两个子进程并发执行了。
运行该程序,可以得到类似如下的输出:
```
Parent process, pid=1234
Child process 1, pid=1235
Child process 2, pid=1236
```
可以看到,首先输出了父进程的信息,然后输出了两个子进程的信息。
在程序中,第一次调用 `fork()` 创建了一个子进程,该子进程复制了父进程的地址空间、代码段、数据段和堆栈等资源,并将其保存在一个新的进程中,同时返回一个新的进程 ID(即子进程的 ID),以区分父进程和子进程。在子进程中,由于 `pid1` 的值为 0,所以输出了对应的信息。
接着,在父进程中再次调用 `fork()` 创建了另一个子进程 `pid2`。与第一次调用 `fork()` 类似,该子进程也复制了父进程的地址空间、代码段、数据段和堆栈等资源,并将其保存在一个新的进程中,同时返回一个新的进程 ID(即子进程的 ID),以区分父进程和子进程。在子进程中,由于 `pid2` 的值为 0,所以输出了对应的信息。
由于父进程在两次调用 `fork()` 后并未执行任何其他操作,因此父进程本身并没有输出信息。但是,由于父进程创建了两个子进程,因此在输出信息时会将所有三个进程的信息一起输出。
阅读全文