Linux:进程相关函数

        在Linux操作系统中,进程管理是一组核心功能,涉及到进程的创建、控制、通信、同步、调度、终止等多个方面。以下是一些常用的Linux进程相关函数及其用法简介:

        1. 进程创建:fork()

pid_t fork(void);

  fork()函数用于创建一个新的进程,它是当前进程(父进程)的一个副本。调用fork()后,系统会创建一个与父进程几乎完全相同的子进程,除了以下几点不同:

  • 子进程获得与父进程相同的内存空间副本(数据段、堆、栈),但具有独立的地址空间,对各自内存的修改互不影响。
  • 子进程的进程ID(PID)与父进程不同,可以通过getpid()获取。
  • 子进程的父进程ID(PPID)设置为调用fork()的进程ID。
  • 子进程的文件描述符表与父进程相同,但指向同一文件的两个描述符共享同一种文件状态标志。
  • 子进程中,fork()返回0;父进程中,fork()返回子进程的PID。

示例:

pid_t pid = fork();
if (pid < 0) {
    // fork()失败,打印错误信息并退出
    perror("fork");
    exit(EXIT_FAILURE);
} else if (pid == 0) {
    // 在子进程中执行的代码
} else {
    // 在父进程中执行的代码
}

        2. 进程终止:exit()_exit()_Exit()abort()

  • exit(status): 该函数终止调用它的进程,并将status作为退出状态传递给父进程。在退出前,exit()会执行以下操作:

    • 执行由atexit()注册的函数。
    • 关闭所有打开的标准I/O流(可能会触发相关缓冲区刷新和关闭处理程序)。
    • status传递给父进程(可通过wait()waitpid()获取)。
  • _exit(status): 类似于exit(), 但不会执行atexit()注册的函数,也不会关闭打开的文件或刷新I/O流。它直接终止进程并传递status给父进程。

  • _Exit(status): 同_exit(),通常作为POSIX标准的一部分提供,行为完全相同。

  • abort(): 强制立即终止进程,同时产生SIGABRT信号。它不会执行任何清理操作,如关闭文件或运行atexit()注册的函数。此外,abort()还会生成一个核心转储(如果系统配置允许)以供调试。

        3. 进程等待:wait()waitpid()

        这两个函数用于父进程等待其子进程的终止,并获取子进程的退出状态。

  • wait(&status): 父进程阻塞,直到任意一个子进程终止。子进程的退出状态被存储在status指向的整型变量中。可以通过宏如WIFEXITED()WEXITSTATUS()等解析这个状态。

  • waitpid(pid_t pid, int *status, int options): 更灵活的版本,允许指定要等待的特定子进程(通过pid参数)。还可以通过options参数设定是否阻塞、等待指定状态的子进程等。返回值为已终止子进程的PID。

        4. 进程替换:exec()系列函数

   exec()家族函数用于在一个已存在的进程中加载并执行新的程序,完全替换当前进程的内存映像。常见的exec()函数包括:

  • execl()
  • execv()
  • execle()
  • execve()
  • execlp()
  • execvp()

        它们的主要区别在于参数列表的格式和如何查找可执行文件。所有这些函数都不会返回,除非发生错误。在成功执行新程序后,当前进程的内存空间被新程序替换,原程序的代码和数据不再存在。

        5. 线程相关函数:pthread_create()pthread_exit()pthread_join()

        对于多线程编程,Linux提供了POSIX线程接口(Pthreads),包括以下关键函数:

  • pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg): 创建一个新的线程,并指定其入口函数(start_routine)和传递给该函数的参数(arg)。新线程的标识符保存在thread指针所指位置。

  • pthread_exit(void *retval): 使当前线程正常退出,并返回一个指针作为线程的返回值。其他线程可以通过pthread_join()获取此返回值。

  • pthread_join(pthread_t thread, void **retval): 阻塞调用线程,直到指定的thread线程终止。如果retval非空,将获取线程退出时通过pthread_exit()提供的返回值。

        以上只是Linux进程管理函数的一小部分概述,实际编程中还可能涉及信号处理(如signal()sigaction())、进程间通信(如管道、消息队列、共享内存、套接字等)、同步机制(如互斥锁、条件变量等)等更复杂的功能。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值