当前位置: 首页 > article >正文

liunx进程函数汇总(包含管道、共享内存、消息队列、信号)

liunx进程函数汇总

fork函数

  • 函数功能:创建子进程
  • 头文件:
    1. #include <unistd.h>
  • 函数原型
int  fork(void);
  • 返回值:函数的奇妙之处在于调用一次,返回两次,可能有3种不同的返回值

    1. 成功:父进程中,fork返回新创建的子进程的PID

      ​ 子进程中,fork返回0

    2. 失败:返回-1

vfork函数

  • 函数功能:创建子进程
  • 头文件:
    1. #include <unistd.h>
    2. #include <sys/types.h>
  • 函数原型
int  vfork(void);
  • 返回值:
    1. 成功:
      • 父进程中,fork返回新创建的子进程的PID
      • 子进程中,fork返回0
    2. 失败:返回-1
fork与vfork区别:
  • fork: 子进程拷贝父进程的数据段,代码段

  • vfork: 子进程与父进程共享数据段和堆栈空间,所以子进程对变量修改和父进程会同步。

  • fork: 子进程和父进程运行次序不固定,由系统调度决定

  • vfork: 子进程会先于父进程运行

exit函数与_exit函数

  • 函数功能:退出、终止程序
  • 头文件
    1. #include <unistd.h>
    2. #include <stdlib.h>
  • 函数原型
void exit(int status);
void _exit(int status);
  • 形参:
    1. status:退出码/退出状态值
  • 返回值:无
exit与_exit函数区别exit相对于_exit 会多一个缓冲区清理的工作

在这里插入图片描述

getpid函数

  • 函数功能:获取当前进程ID
  • 头文件
    1. #include <unistd.h>
    2. #include <sys/types.h>
  • 函数原型
pid_t getpid(void);
  • 返回值:(此函数不会出错)
    1. 成功:返回当前进程ID

getppid函数

  • 函数功能:获取当前进程ID
  • 头文件
    1. #include <unistd.h>
    2. #include <sys/types.h>
  • 函数原型
pid_t getppid(void);
  • 返回值:(此函数不会出错)
    1. 成功:返回当前进程的父进程ID

wait函数

  • 函数功能:阻塞父进程,直到某个子进程退出

  • 头文件:

    1. #include <sys/types.h>

    2. #include <sys/wait.h>

  • 函数原型

pid_t wait(int *status);
  • 形参:

    1. *status:获取子进程结束状态值,获取到status后用 WEXITSTATUS(status) 来转换子进程退出时的退出码

      对于转换就是返回值%0377(八进制数)等效于于对256取余

  • 返回值

    1. 成功:返回退出子进程的ID
    2. 失败:返回-1

waitpid函数

  • 函数功能:阻塞调用进程,直到某个子进程退出

  • 头文件:

    1. #include <sys/types.h>

    2. #include <sys/wait.h>

  • 函数原型

pid_t waitpid(pid_t pid, int *status, int options);
  • 形参:

    1. pid:欲等待的子进程识别码

      参数值说明
      pid<-1等待进程组号为pid绝对值的任何子进程。
      pid=-1等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
      pid=0等待进程组号与目前进程相同的任何子进程,也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。
      pid>0等待进程号为pid的子进程。
    2. *status:保存子进程的状态信息,有了这个信息父进程就可以了解子进程为什么会退出,是正常退出还是出了什么错误

      宏名说明
      WIFEXITED(status)如果子进程正常结束,它就返回真;否则返回假。
      WEXITSTATUS(status)如果WIFEXITED(status)为真,则可以用该宏取得子进程exit()返回的结束代码。
      WIFSIGNALED(status)如果子进程因为一个未捕获的信号而终止,它就返回真;否则返回假。
      WTERMSIG(status)如果WIFSIGNALED(status)为真,则可以用该宏获得导致子进程终止的信号代码。
      WIFSTOPPED(status)如果当前子进程被暂停了,则返回真;否则返回假。
      WSTOPSIG(status)如果WIFSTOPPED(status)为真,则可以使用该宏获得导致子进程暂停的信号代码。
    3. options:控制waitpid()函数的行为。如果不想使用这些选项,则可以把这个参数设为0。

      参数说明
      WNOHANG如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
      WUNTRACED如果子进程进入暂停状态,则马上返回。
  • 返回值

    1. 成功:返回退出子进程的ID
    2. 失败:返回-1
  • 示例:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    pid_t pid, childpid;
    int status = 0;
    pid = fork();
    if (pid < 0)
        printf("Error occured on forking.\n");
    else if (pid == 0)    //子进程
    {
        sleep(3);   //换成3s,然后kill -9 子进程pid
        exit(0);
    }   
    else                    //父进程
    {
        //返回后继续执行父进程的代码段
    }
    printf("pid:%d\n",pid); //打印子进程id

    do
    {
        childpid = waitpid(pid, &status, WNOHANG);
        if (childpid == 0)
        {
            printf("No child exited,ret = %d\n", childpid);
            sleep(1);
        }
    } while (childpid == 0);
    if (WIFEXITED(status))
        printf("正常退出:%d\n",childpid);
    if(WIFSIGNALED(status) && WTERMSIG(status) == SIGKILL)
        printf("被SIGKILL信号结束\n");
}

execv函数

进程程序替换

正在执行的进程本身的pcb,mm_struct,页表等信息不会发生改变,仅仅把一个新的程序代码和数据替换了原来进程的代码和数据;这就是进程程序的替换;进程程序替换并不会创建新的进程,它只会加载程序的代码和数据,去替换原来的进程

  • 函数功能:path或者file所指定的进程地址空间替换调用进程的地址空间
  • 头文件:
    1. #include <unistd.h>
  • 函数原型
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

  • 形参
    1. path:可执行文件的路径
    2. arg(多个参数):可执行程序所带的参数,第一个参数为可执行文件名字,arg必须以NULL结束
    3. file:如果参数file中包含路径,则就从此路径查找,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。
    4. envp[]:自己组装键值对的格式参数并传入
  • 返回值:
    1. 成功:无返回
    2. 失败:返回-1

进程间通信函数

pipe函数(无名管道)

  • 函数功能:创建匿名管道
  • 头文件:
    1. #include <unistd.h>
  • 函数原型
int pipe(int fd[2]);
//实例
int fd[2] = {0};
int r = pipe(fd);
  • 形参:
    1. fd:管道描述符;若创建后
      • fd[0]表示读端
      • fd[1]表示写端
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

mkfifo函数(有名管道)

  • 函数功能:创建一个命名管道
  • 头文件:
    1. #include <sys/types.h>
    2. #include <sys/stat.h>
  • 函数原型
int  mkfifo(const char* pathname,mode_t mode);
  • 形参:
    1. pathname:创建FIFO文件路径和文件名
    2. mode:FIFO文件权限
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

shmget函数(共享内存)

  • 函数功能:得到一个共享内存的描述符,创建一个共享内存对象并返回标识符
  • 头文件:
    1. #include <sys/ipc.h>
    2. #include <sys/shm.h>
  • 函数原型
int  shmget(key_t key,size_t size,int shmflg);
  • 形参:

    1. key:通常是ftok函数返回的PID

      • ftok函数
      key_t ftok(const char *pathname, int proj_id);
      //pathname:可访问的路径;proj_id:就是PID可指定任意整型数据也可使用getpid()
      
    2. size:创建共享内存大小,以字节为单位

    3. shmflg

      • IPC_CREAT:创建共享内存若存在则返回其PID
      • IPC_CREAT|IPC_EXCL:检查并创建,若存在返回-1
  • 返回值

    1. 成功:返回内存表示符PID
    2. 失败:返回-1

shmat函数(共享内存)

  • 函数功能:连接共享内存,成功后会将共享内存映射到调用进程的地址空间
  • 头文件
    1. #include <sys/types.h>
    2. #include <sys/shm.h>
  • 函数原型
void*  shmat(int shmid,const void* shmaddr,int shmflg);
  • 形参
    1. shmid:共享内存表示符PID
    2. shmaddr:指定共享内存映射到地址空间什么位置,若为NULL则内核自己决定
    3. shmflg:0是可读可写
  • 返回值
    1. 成功:返回已链接的地址
    2. 失败:返回 (void*)-1;

shmdt函数(共享内存)

  • 函数功能:断开之前链接的共享内存
  • 头文件
    1. #include <sys/types.h>
    2. #include <sys/shm.h>
  • 函数原型
int  shmdt(const void* shmaddr);
  • 形参
    1. shmaddr:需要断开的共享内存的首地址
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

shmdt函数(共享内存)

  • 函数功能:断开之前连接的共享内存
  • 头文件
    1. #include <sys/types.h>
    2. #include <sys/shm.h>
  • 函数原型
int shmdt(const void* shmaddr);
  • 形参
    1. shmaddr:连接的共享内存的起始地址
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

shmctl函数(共享内存)

  • 函数功能:控制共享内存的运行
  • 头文件
    1. #include <sys/types.h>
    2. #include <sys/shm.h>
  • 函数原型
int  shmctl(int shmid,int cmd, struct shmid_ds *buf);
  • 形参

    1. shmid:共享内存的标识符PID
    2. cmd:操作模式
    名称说明
    IPC_STAT将共享内存的信息复制到buf
    IPC_SET将buf中的数据共享到内存信息
    IPC_RMID删除共享内存
    IPC_LOCK不让共享内存置换到SWAP
    IPC_UNLOCK允许共享内存置换到SWAP

    IPC_LOCK和IPC_UNLOCK只有root可以使用

    1. buf:指向struct shmid ds 结构体的指针
  • 返回值

    1. 成功:返回0
    2. 失败:返回-1
//buf指向的结构体原型
/usr/include/linux/shm.h struct shmid_ds
{
    struct ipc_perm shm_perm;    /* 操作权限 */
    int shm_segsz;               /* 共享内存大小 (bytes) */
    __kernel_time_t shm_atime;   /* 最近映射的时间 */
    __kernel_time_t shm_dtime;   /* 最近断开的时间 */
    __kernel_time_t shm_ctime;   /* 最近改变结构数据时间 */
    __kernel_ipc_pid_t shm_cpid; /* 创建共享内存的进程ID */
    __kernel_ipc_pid_t shm_lpid; /*最新操作共享内存的进程ID */
    unsigned short shm_nattch;   /*当前映射到该段的进程的个数 */
    unsigned short shm_unused;   /* compatibility */
    void *shm_unused2;           /* ditto - used by DIPC */
    void *shm_unused3;           /* 系统预留 */
};

msgget函数(消息队列)

  • 函数功能:获取/创建一个消息队列
  • 头文件:
    1. #include <sys/ipc.h>
    2. #incude <>sys/msg.h>
    3. #include <sys/types.h>
  • 函数原型
int msgget(key_t key,int msgflg);
  • 形参

    1. key:是一个键值,用于标识消息队列。可以指定也可以通过ftok函数计算获得

      //将指定的文件,和整数标识符转换成key_t类型的数据
      key_t ftok(const char *pathname, int proj_id)//pathnam:指定的文件/路径
      //proj_id:整数标识符
      
    2. msgflg:消息队列建立标志和存储权限

      • IPC_CREAT:若不存在则创建;若存在则获取消息队列的id
      • IPC_EXCL:若不存在则创建;若存在产生错误并返回
  • 返回值:

    1. 成功:返回消息队列标识符
    2. 失败:返回-1

msgsnd函数(消息队列)

//消息队列结构体
struct msgbuf
{
    long mtype;    /* 区分消息队列 */
    char mtext[1]; /* 需要发送的数据 */
};
  • 函数功能:发送信息,把一条消息添加到消息队列里去
  • 头文件
    1. #include <sys/ipc.h>
    2. #include <sys/msg.h>
    3. #include <sys/types.h>
  • 函数原型
int msgsnd(int msgid,const void* msgp,size_t msgsz,int msgflg);
  • 形参
    1. msgid:消息队列标识符;msgget函数返回的消息队列标识码
    2. msgp:是指针,指针指向准备发送的消息的结构体
    3. msgsz:要发送消息的实际数据长度
    4. msgflg:权限,0表示读写
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

msgrcv函数(消息队列)

  • 函数功能:从消息队列中读取消息
  • 头文件
    1. #include <sys/ipc.h>
    2. #include <sys/msg.h>
    3. #include <sys/types.h>
  • 函数原型
size_t  msgrcv(int msgid, void* msgp,size_t msgsz,long msgtype,int msgflg);
  • 形参
    1. msgid:消息队列标识符;msgget函数返回的消息队列标识码
    2. 是一个指针,指针指向准备接收的消息
    3. msgsz:发送结构体中除了long 的大小
    4. msgtype:区分消息队列(当发送和接收的数字一样才可以实现数据传递)
    5. msgflg:类似权限可以写0表示读写
  • 返回值:
    1. 成功:返回实际放到缓冲区的字符个数
    2. 失败:返回-1

msgctl函数(消息队列)

  • 函数功能:控制消息队列
  • 头文件
    1. #include <sys/ipc.h>
    2. #include <sys/msg.h>
    3. #include <sys/types.h>
  • 函数原型
int  msgctl(int msgid,int cmd, struct msqid_ds *buf);
  • 形参

    1. msgid:消息队列标识符;msgget函数返回的消息队列标识码

    2. cmd:操作模式

名称说明
IPC_STAT将消息队列信息复制到buf
IPC_SET将buf信息复制到消息队列
IPC_RMID删除消息队列
IPC_INFO获取消息队列的limit信息
  1. *buf:指向struct_msgid_ds 结构体的指针

    //struct_msgid_ds结构体
    / usr / include / linux / msg.h struct msqid_ds
    {
        struct ipc_perm msg_perm;  /*操作权限结构 */
        time_t msg_stime;          /*最后发送时间*/
        time_t msg_rtime;          /*最后接收时间*/
        time_t msg_ctime;          /*消息队列最后修改时间*/
        unsigned long _msg_cbytes; /*队列中当前字节数*/
        msgqnum_t msg_qnum;        /*队列中消息数*/
        msglen_t msg_qbytes;       /*队列可容纳的最大字节数*/
        pid_t msg_lspid;           /*最后发送消息的进程号*/
        pid_t msg_lrpid;           /*最后接收消息的进程号*/
    };
    
  • 返回值

    1. 成功:返回0
    2. 失败:返回-1

signal函数(信号函数)

  • 函数功能:用于捕获信号,可指定信号处理方式
  • 头文件
    1. #include <signal.h>
  • 函数原型
void (*signal(int sig, void (*func)(int)))(int);
  • 形参
    1. signum:指明了所要处理的信号类型
    2. func:函数指针描述与信息关联的动作
  • 返回值
    1. 成功:返回先前的信号处理函数指针
    2. 失败:返回SIG_ERR(-1)

raise函数(信号函数)

  • 函数功能:指定信号发送给自身
  • 头文件
    1. #include <signal.h>
  • 函数原型
int raise(int sig);
  • 形参
    1. sig:指定的信号ID
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

kill函数(信号函数)

  • 函数功能:将指定信号通过进程PID发送给指定进程
  • 头文件
    1. #include <sys/types.h>
    2. #include <signal.h>
  • 函数原型
int kill(pid_t pid,int sig);
  • 形参

    1. pid:进程描述符(pid)

      参数描述
      pid>0将信号发送给进程ID为pid 的进程。
      pid=0将信号发送给和当前进程相同进程组的所有进程;
      pid=-1将信号广播发送给系统内所有的进程;
      pid<-1将信号发送给进程组号为pid绝对值的所有进程
    2. sig:信号ID

  • 返回值

    1. 成功:返回0
    2. 失败:返回-1

sigprocmask函数(信号函数)

  • 函数功能:阻塞或解除阻塞一个或多个信号

    阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。

  • 头文件

    1. #include <signal.h>
  • 函数原型

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
  • 形参

    1. how:操作方式

      参数说明
      SIG_BLOCKset指向的信号集中的信号添加到当前信号屏蔽字中。
      SIG_UNBLOCK从当前信号屏蔽字中移除 set指向的信号集中的信号。
      SIG_SETMASKset指向的信号集替换当前信号屏蔽字。
    2. *set:指向需要修改的信号集替换当前信号屏蔽

    3. oldset:原有的信号集,可以设置为NULL

  • 返回值

    1. 成功:返回0
    2. 失败:返回-1

sigqueue函数(信号函数)

  • 函数功能:给指定进程发送信号,并携带数据
  • 头文件
    1. #include <signal.h>
  • 函数原型
int sigqueue(pid_t pid, int sig, const union sigval value);
  • 形参

    1. pid:目标程序描述符(pid)

    2. sig:需要发送的信号

    3. value:携带的数据

      union sigval
      {
          int sival_int;
          void *sival_ptr;
      };
      
  • 返回值

    1. 成功:返回0
    2. 失败:返回-1

sigaction函数 (信号函数)

  • 函数功能:检查或修改与指定信号相关联的处理动作
  • 头文件
    1. #include <signal.h>
  • 函数原型
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
  • 形参
  1. signum:需要捕获的信号

  2. *act:信号处理方式

struct sigaction
{
   void (*sa_handler)(int);
   void (*sa_sigaction)(int, siginfo_t *, void *);
   sigset_t sa_mask;
   int sa_flags;
   void (*sa_restorer)(void);
}
  1. *oldact:原处理方式
  • 返回值
    1. 成功:返回0
    2. 失败:返回-1

http://www.kler.cn/a/509722.html

相关文章:

  • 《AI赋能光追:开启图形渲染新时代》
  • 关于AWS网络架构的思考
  • 《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • Spring框架 了解
  • ant design vue的级联选择器cascader的悬浮层样式怎么修改
  • 从 SQL 语句到数据库操作
  • 浅谈计算机网络03 | 现代网络组成
  • 【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接
  • PostgreSQL-WAL日志介绍(一)
  • 蓝桥杯训练—矩形面积交
  • 服务器怎样防范网络蠕虫病毒?
  • Ubuntu 手动安装 Open WebUI 完整指南
  • 《CPython Internals》阅读笔记:p221-p231
  • 【优化算法】狭义相对论搜索算法:一种基于狭义相对论物理学的元启发式方法
  • 《内网穿透:开启网络世界的任意门》
  • 于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)
  • 20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识
  • 深入浅出JSON:数据交换的轻量级解决方案
  • OpenVela——专为AIoT领域打造的开源操作系统
  • SpringBoot3 升级介绍
  • Hexo + NexT + Github搭建个人博客
  • 解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated
  • 复健第二天之[MoeCTF 2022]baby_file
  • ASP.NET Core中 JWT 实现无感刷新Token
  • Python+Jenkins自动化测试持续集成
  • AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式