进程创建:
在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秒然后结束。父进程会等待子进程结束后再结束。通过这个程序,您可以体验到进程的创建、回收和结束过程。