📜  在fork()中搜索(1)

📅  最后修改于: 2023-12-03 15:23:23.338000             🧑  作者: Mango

在 fork() 中搜索

在编写多进程程序时,fork() 是一个常用的系统调用。fork() 可以创建一个子进程,让子进程和父进程同时执行不同的代码。在子进程中,可以使用 exec() 系列函数来执行新的程序,从而实现进程替换。

如果需要在 fork() 中搜索特定条件的进程,可以使用以下方法:

在父进程中搜索

在父进程中,可以使用 waitpid() 函数等待子进程结束,并返回子进程的状态。如果需要搜索特定条件的子进程,可以在循环中调用 waitpid() 函数,并提供相关的条件。以下是一个示例代码:

pid_t pid;
int status;

while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
    /* 调用其他函数处理子进程状态 */
}

在上述代码中,waitpid() 函数用于等待任意子进程结束,-1 表示任意子进程。WNOHANG 表示在没有子进程结束时立即返回,不阻塞当前进程。如果 waitpid() 返回的 pid 大于 0,表示子进程已结束,可以调用其他函数来处理子进程的状态。

在子进程中搜索

在子进程中搜索其他进程可以使用 proc 文件系统。proc 文件系统是一个虚拟文件系统,它提供一个接口,可以访问系统中正在运行的进程信息。

以下是一个示例代码,用于在子进程中搜索所有用户 ID 为 1000 的进程:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *entry;
    char path[1024];

    if ((dir = opendir("/proc")) == NULL) {
        perror("opendir error");
        exit(EXIT_FAILURE);
    }

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR) {
            sprintf(path, "/proc/%s/status", entry->d_name);
            FILE *fp = fopen(path, "r");
            char buff[1024];
            if (fp) {
                while (fgets(buff, sizeof(buff), fp) != NULL) {
                    if (strncmp(buff, "Uid:", 4) == 0) {
                        int uid;
                        sscanf(buff + 4, "%d", &uid);
                        if (uid == 1000) {
                            printf("find uid 1000 in %s\n", entry->d_name);
                        }
                    }
                }
                fclose(fp);
            }
        }
    }

    closedir(dir);

    return 0;
}

在上述代码中,opendir() 函数用于打开 /proc 目录,readdir() 函数用于读取目录中的文件和子目录。对于每个子目录,程序使用 sprintf() 函数构造出该进程的状态文件路径,并打开该文件。接着,程序读取文件内容,查找其中的 Uid 字段,并解析出用户 ID。最后,如果用户 ID 等于 1000,程序输出该进程的 ID。

总结

在 fork() 中搜索进程需要在父进程和子进程中分别处理。父进程可以使用 waitpid() 函数等待子进程结束,并处理子进程的状态。子进程可以使用 proc 文件系统读取其他进程的信息,从而查找满足特定条件的进程。