进程创建:在Linux中,进程的创建通常通过fork()函数来实现。fork()函数会创建一个新的进程,新进程是调用进程的副本,但具有不同的PID。函数定义:#include <unistd.h>
pid_t fork(void);
函数原型:fork()函数会返回两次,一次在父进程中返回新创建子进程的PID,一次在子进程中返回0。如果出现错误,fork()会返回-1。进程回收:进程的回收通常通过wait()或waitpid()函数来实现。这些函数用于父进程等待子进程结束,并回收子进程的资源。函数定义:#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
函数原型:wait()函数会阻塞父进程,直到任何一个子进程结束。waitpid()函数允许父进程指定等待的子进程PID,以及一些其他选项。进程结束:进程可以通过exit()函数来正常结束,也可以通过kill()函数发送信号来终止进程。函数定义:#include <stdlib.h>
#include <signal.h>
void exit(int status);
int kill(pid_t pid, int sig);
函数原型:exit()函数会终止当前进程,并返回一个状态码。kill()函数用于向指定进程发送信号。其他进程相关函数:除了上述函数外,还有一些其他与进程相关的函数:getpid():获取当前进程的PID。getppid():获取当前进程的父进程的PID。exec()系列函数:用于在当前进程中执行新的程序。signal():用于设置信号处理函数。sleep():使当前进程进入睡眠状态。使用C语言代码举例:#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "Fork failed\n");
return 1;
} else if (pid == 0) {
// 子进程
printf("Child process created with PID: %d\n", getpid());
sleep(3);
printf("Child process finished\n");
exit(0);
} else {
// 父进程
printf("Parent process with PID: %d\n", getpid());
wait(NULL);
printf("Parent process finished\n");
}
return 0;
}
在这个例子中,父进程创建了一个子进程,子进程会睡眠3秒然后结束。父进程会等待子进程结束后再结束。通过这个程序,您可以体验到进程的创建、回收和结束过程。 |