fork perror exit sleep waitpid的区别
时间: 2024-06-02 08:08:16 浏览: 77
这四个函数都是在C语言中用来操作进程的函数。
- fork函数用于创建一个新的子进程,它复制了父进程的所有内存和资源,并在子进程中运行指定的代码段。子进程和父进程是相互独立的,它们各自拥有自己的内存空间和资源。
- perror函数用于输出错误信息。通常在系统调用出错时使用,它会根据当前的errno值输出相应的错误信息。
- exit函数用于终止进程的执行,并将指定的退出码返回给父进程。退出码通常用于表示进程的执行结果,0表示成功,非0表示失败。
- sleep函数用于使当前进程休眠指定的秒数。在休眠期间,当前进程不会被调度,直到休眠时间结束后才会继续执行。
- waitpid函数用于等待指定的进程结束,并获取它的退出码。如果指定的进程已经结束,waitpid会立即返回,否则它会阻塞当前进程,直到指定的进程结束。
总的来说,这四个函数的功能不同,分别用于创建新的进程、输出错误信息、终止当前进程、使当前进程休眠和等待指定进程的结束。它们在进程编程中都有着重要的作用。
相关问题
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if (pid < 0) { perror("fork fail\n"); exit(-1); } else if ( pid == 0 ) // 子进程1 { printf("b\n"); sleep(5); exit(0); } else { printf("a\n"); // 父进程 waitpid(pid,NULL,0); printf("my son has exit!\n"); exit(0); } }的waitpid(pid,NULL,0)有什么用
waitpid(pid,NULL,0)是父进程等待子进程结束的一种方式。其中,pid是子进程的进程ID,NULL表示不需要获取子进程的结束状态,0表示等待任何子进程结束。
在该代码中,父进程通过waitpid函数等待子进程结束,以确保子进程在父进程之前结束。如果不等待子进程结束,父进程可能会在子进程之前退出,导致子进程变成孤儿进程,从而由init进程接管,造成资源浪费和系统性能降低。
因此,使用waitpid函数可以保证父子进程的正确协同执行。
使用fork函数父进程创造子进程,fork()的值为判断条件,当fork()返回值=0,子进程暂停8秒,子进程退出。结束。fork()返回值>0时,父进程开始waitpid()判断,waitpid()的返回值,waitpid()返回值=0时,父进程暂停一秒,回到父进程waitpid(),如果waitpid返回值不为0,捕获子进程,退出。当fork()值<0时,结束。linux系统中,用C语言代码。
好的,以下是对应的 C 语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid;
int status;
while ((pid = fork()) >= 0) { // 循环判断条件
if (pid == 0) { // 子进程
sleep(8); // 暂停 8 秒
exit(0);
} else { // 父进程
pid_t child;
do {
child = waitpid(pid, &status, WNOHANG); // 非阻塞等待子进程结束
if (child == pid) { // 子进程结束
printf("child process %d terminated\n", pid);
exit(0);
} else if (child < 0) { // 等待出错
perror("waitpid error");
exit(1);
} else { // 子进程还在运行
printf("child process %d still running\n", pid);
sleep(1); // 暂停 1 秒
}
} while (child == 0); // waitpid 返回 0,表示子进程还在运行,继续等待
exit(0);
}
}
perror("fork error");
exit(1);
}
```
这个程序中,使用一个 while 循环来判断条件,每次循环都会调用 `fork()` 函数创建一个子进程。如果 `fork()` 返回值小于 0,则表示创建子进程失败,直接退出程序。如果 `fork()` 返回值为 0,则表示当前进程是子进程,暂停 8 秒后退出。如果 `fork()` 返回值大于 0,则表示当前进程是父进程,开始等待子进程结束。在等待子进程结束的过程中,使用 `waitpid()` 函数进行非阻塞等待,每等待一次就判断子进程是否结束,如果结束则退出程序;如果子进程还在运行,则暂停 1 秒后再次等待,直到等待到了子进程结束。在结束子进程之前,使用 `do...while` 循环来等待子进程结束。需要注意的是,在 `waitpid()` 函数中使用了 `WNOHANG` 参数,表示非阻塞等待子进程结束。如果不加这个参数,则 `waitpid()` 函数会一直阻塞直到子进程结束,这显然不符合我们的需求。
阅读全文