在Linux系统中,fork()
是一个系统调用,用于创建一个新的进程。新进程(子进程)是调用 fork()
的进程(父进程)的一个副本。子进程继承了父进程的地址空间、文件描述符、信号处理程序等,但它们有各自独立的进程ID。
fork()
创建子进程的进程。fork()
创建的新进程。fork()
的优势fork()
的类型在Linux中,fork()
主要有两种类型:
fork()
:创建一个与父进程几乎完全相同的子进程。fork()
与 vfork()
:vfork()
创建的子进程会共享父进程的地址空间,直到子进程调用 exec()
或 _exit()
。在Linux中,可以通过遍历 /proc
目录来查看系统中的所有进程。每个进程在 /proc
目录下都有一个对应的子目录,目录名是进程的PID。
以下是一个简单的示例代码,展示如何遍历并打印所有进程的PID和命令行:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <ctype.h>
int is_numeric(const char *str) {
while (*str) {
if (!isdigit(*str)) {
return 0;
}
str++;
}
return 1;
}
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir("/proc");
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
if (is_numeric(entry->d_name)) {
char path[256];
snprintf(path, sizeof(path), "/proc/%s/cmdline", entry->d_name);
FILE *fp = fopen(path, "r");
if (fp) {
char cmdline[256];
if (fgets(cmdline, sizeof(cmdline), fp)) {
printf("PID: %s, CMD: %s
", entry->d_name, cmdline);
}
fclose(fp);
}
}
}
closedir(dir);
return 0;
}
fork()
失败:ulimit
命令调整限制,或者优化程序以减少进程创建。wait()
或 waitpid()
来回收子进程的资源。wait()
或 waitpid()
来回收子进程的资源。通过以上方法,可以有效地使用 fork()
创建和管理进程,并遍历系统中的所有进程。
领取专属 10元无门槛券
手把手带您无忧上云