首页 > 系统相关 >进程常用api

进程常用api

时间:2024-08-13 17:50:26浏览次数:12  
标签:返回 常用 const EOF int char api 进程

进程常用api

fork

该api用于创建子进程,创建出的子进程与父进程共享内存和数据。

pid_t fork(void)
return:在子进程返回0;在父进程中返回子进程的PID;发生错误时返回EOF

例:

pid_t PID = fork();
if (PID < 0) {
    perror("fork");
    exit(EXIT_FAILURE);
}
else if (PID == 0) {
    //子进程
}
else {
    //父进程
}

getpid

该api用于查询调用进程的PID

pid_t getpid(void)
return:返回调用进程的PID且不会失败

例:

printf("当前进程的PID为%d\n",getpid());

getppid

该api用于查询调用进程的父进程PID

pid_t getppid(void)
return:返回调用进程的父进程的PID且不会失败

例:

printf("当前进程的PID为%d,父进程PID为%d\n",getpid(),getppid());

sleep

该api用于让整个进程休眠指定时间

unsigned int sleep(unsigned int seconds)
return:如果sleep()正常执行且休眠时间结束,则返回0;如果休眠提前结束,则返回剩余的未休眠秒数

例:

pid_t PID = fork();
if (PID < 0) {
    perror("fork");
    exit(EXIT_FAILURE);
}
else if (PID == 0) {
    sleep(1);
    //子进程
}
else {
    //父进程
}
//子进程休眠1s,父进程先执行

execve

该api用于从一个进程中跳转到执行另外一个程序

int execve (const char *__path, char *const __argv[], char *const __envp[])
const char *__path:要执行程序的完整路径名
char *const __argv[]:指向字符串数组的指针,需要传入多个参数。1、需要执行的程序(同*__path) 2、执行程序需要传入的参数 3、最后一个参数必须是NULL
char *const __envp[]:指向字符串数组的指针,需要传入多个环境变量参数。1、环境变量参数,固定格式key=value 2、最后一个参数必须是NULL
return:成功会跳转到要执行的程序,失败返回EOF

例:

char *name = "caixukun";
char *path = "/home/atguigu/process_test/erlou";
char *argv[] = {path,name,NULL};
char *envp[] = {NULL};//使用绝对路径不需要传递环境变量
if (execve(argv[0],argv,envp) == EOF) {
    perror("execve");
    exit(EXIT_FAILURE);
}

waitpid

该api用于等待子进程执行结束

pid_t waitpid(pid_t pid, int *wstatus, int options)
pid_t pid:等待的模式
int *wstatus:整数指针,用于存放等待进程的返回的状态码
int options:额外功能
return:如果成功等到子进程停止,返回PID,失败返回EOF

pid_t pid的等待模式如下:

1、小于-1 例如-1 * pgid,则等待进程组ID等于pgid的所有进程终止

2、等于-1 会等待任何子进程终止,并返回最先终止的子进程的进程ID 儿孙都算

3、等于0 等待同一进程组中任何子进程终止(但不包括组领导进程) 只算儿子

4、大于0 仅等待指定进程ID的子进程返回

options的额外功能如下:

1、WNOHANG 如果没有子进程终止,也立即返回;用于查看子进程状态而非等待

2、WUNTRACED 收到子进程处于收到信号停止的状态,也返回

3、WCONTINUED(自Linux2.6.10起) 如果通过发送SIGCONT信号恢复了一个停止的子进程,则也返回

例:

waitpid(PID,NULL,0);

pipe

该api用于创建匿名管道

int pipe(int pipefd[2])
pipefd:用于返回指向管道两端的文件描述符,pipefd[0]指向管道的读端,pipefd[1]指向管道的写端
return:成功返回0,失败返回EOF

例:

int pipefd[2];
if (pipe(pipefd) == -1)
{
	perror("创建管道失败\n");	
	exit(EXIT_FAILURE);
}
pid_t PID = fork();
if (PID < 0) {
    perror("fork");
    exit(EXIT_FAILURE);
} 
else if(PID == 0) {
    //子进程读数据
    close(pipefd[1]);
    while(read(pipefd[0],&buf,sizeof(buf)) != EOF) {
        write(STDOUT_FILENO,&buf,1);
    }
    close(pipefd[0]);
}
else {
    //父进程写数据
    close(pipefd[0]);
    write(pipefd[1],argv[1],strlen(argv[1]));
    close(pipefd[1]);
}

mkfifo

该api用于创建有名管道

int mkfifo(const char *pathname, mode_t mode)
const char *pathname:有名管道绑定的文件路径
mode_t mode:有名管道绑定文件的权限
return:成功返回0,失败返回EOF

例:

char *pipe_path = "/tmp/myfifo";
if (mkfifo(pipe_path,0666) != 0) {
    perror("mkfifo");
    exit(EXIT_FAILURE);
}

有名管道发送端

int FD = open(pipe_path,O_WRONLY);
char write_buf[100];
ssize_t read_num;
while(read_num = read(STDIN_FILENO,write_buf,100) > 0) {
    write(FD,write_buf,read_num);
}
close(FD);
if (unlink(pipe_path) == EOF) {
    perror("unlink");
    exit(EXIT_FAILURE);
}

有名管道接收端

int FD = open(pipe_path,O_RDONLY);
char read_buf[100];
ssize_t read_num;
while(read_num = read(fd,read_buf,100) > 0) {
    write(STDOUT_FILENO,read_buf,read_num);
}
close(FD);
if (unlink(pipe_path) == EOF) {
    perror("unlink");
    exit(EXIT_FAILURE);
}
//有名管道使用后,应通过unlink调用清除相关资源。

shm_open

该api用于开启一块共享内存对象

int shm_open(const char *name, int oflag, mode_t mode)
const char *name:共享内存对象路径名称
int oflag:打开模式,可二进制拼接
mode_t mode:创建共享内存对象的权限
return:成功返回一个新的文件描述符,失败返回EOF

打开模式如下:

1、O_CREAT:如果不存在则创建新的共享内存对象

2、O_EXCL:当与 O_CREAT 一起使用时,如果共享内存对象已经存在,则返回错误(避免覆盖现有对象)

3、O_RDONLY:以只读方式打开

4、O_RDWR:以读写方式打开

5、O_TRUNC 用于截断现有对象至 0 长度(只有在打开模式中包含 O_RDWR 时 才有效)

例:

char *shm_name = "/letter";
int FD = shm_open(shm_name,O_CREAT | O_RDWR,0666);
if (FD < 0) {
    perror("shm_open");
    exit(EXIT_FAILURE);
}

该api用于删除一个先前由shm_open()创建的共享内存对象

int shm_unlink(const char *name)
const char *name:共享内存对象路径名称
return:成功返回0,失败返回EOF

例:

int Result = shm_unlink(shm_name);
if (Result < 0) {
    perror("shm_unlink");
    exit(EXIT_FAILURE);
}

truncate和ftruncate

truncate 和 ftruncate 都可以将文件缩放到指定大小,二者的行为类似:如果文件被缩小,截断部分的数据丢失,如果文件空间被放大,扩展的部分均为\0 字符。缩放前后文件的偏移量不会更改。缩放成功返回 0,失败返回-1。

int truncate(const char *path, off_t length)
const char *path:要处理文件的路径名称,指定文件存在即可,无需打开
off_t length:指定长度,单位是字节
return:成功返回0,失败返回EOF
 
int ftruncate(int fd, off_t length)
int fd:文件描述符,需要打开并且有写权限
off_t length:指定长度,单位是字节
return:成功返回0,失败返回EOF

例:

int FD = shm_open(shm_name,O_CREAT | O_WRONLY,0666);
ftruncate(FD,100);

mmap

该api用于将一组设备或文件映射到内存地址

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset)
void *addr:指向期望映射的内存起始地址的指针,通常设为NULL,让系统选择合适的地址
size_t length:要映射的内存区域的长度,以字节为单位
int prot:内存映射区域保护标志
int flags:映射选项标志
int fd:文件描述符,用于指定要映射的文件或设备
off_t offset:从文件开头的偏移量,映射开始的位置
return:成功时返回映射区域的起始地址,失败返回EOF

int prot的内存映射区域保护标志如下:

1、PROT_READ:允许读取映射区域

2、PROT_WRITE:允许写入映射区域

3、PROT_EXEC:允许执行映射区域

4、PROT_NONE:页面不可访问

int flags映射选项标志如下:

1、MAP_SHARED:映射区域是共享的,对映射区域的修改会影响文件和其他映射到同一区域的进程

2、MAP_PRIVATE:映射区域是私有的,对映射区域的修改不会影响原始文 件,对文件的修改会被暂时保存在一个私有副本中

3、MAP_ANONYMOUS:创建一个匿名映射,不与任何文件关联

4、MAP_FIXED:强制映射到指定的地址,如果不允许映射,将返回错误

例:

share = mmap(NULL, 100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

mq_open

该api用于创建或打开一个已经存在的消息队列

mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
const char *name:消息队列的名称,必须是以正斜杠"/"开头,以"\0"结尾的字符串,中间可以包含若干字符,但不能有正斜杠
int oflag:指定消息队列的控制权限
mode_t mode:每个消息队列在mqueue文件系统对应一个文件,mode是用来指定消息队列对应的文件权限	
struct mq_attr *attr:属性信息,如果为NULL,则队列以默认属性创建
return:成功则返回消息队列描述符,失败返回EOF

int oflag控制权限必须包含以下三种之一:

1、O_RDONLY 打开的消息队列只用于接收消息

2、O_WRONLY 打开的消息队列只用于发送消息

3、O_RDWR 打开的消息队列可以用于收发消息

int oflag可以与以下0至多项或操作之后作为oflag:

1、O_CLOEXEC 设置 close-on-exec 标记,这个标记表示执行 exec 时关闭文件描述符

2、O_CREAT 当文件描述符不存在时创建它,如果指定了这一标记,需要额外提供 mode 和 attr 参数

3、 O_EXCL 创建一个当前进程独占的消息队列,要同时指定 O_CREAT,要求创建的消息 队列不存在,否则将会失败,并提示错误 EEXIST

4、* O_NONBLOCK 以非阻塞模式打开消息队列,如果设置了这个选项,在默认情况下收发 消息发生阻塞时,会转而失败,并提示错误 EAGAIN

例:

char *mq_name = "/mymq";
int mqd = mq_open(mq_name,O_RDWR | O_CREAT,0664,NULL)

mq_timedsend

该api用于发送消息到消息队列中

int mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout)
mqd_t mqdes:消息队列的描述符
const char *msg_ptr:指向消息的指针
size_t msg_len:msg_ptr指向的消息长度,不能超过msg_len属性指定的最大值
unsigned int msg_prio:指定消息的优先级,消息队列中的数据是按照优先级降序排列的
const struct timespec *abs_timeout:指向timespec类型的对象,指定了阻塞等待的最晚时间
return:成功返回0,失败返回EOF

例:

char *send_buf[100];
if(mq_timedsend(mqd,send_buf,strlen(send_buf),0,&time_info) == EOF) {
    perror("mq_timedsend");
    exit(EXIT_FAILURE);
}

mq_timedreceive

该api用于接收消息队列中的消息

ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout)
mqd_t mqdes:消息队列的描述符 
char *msg_ptr:接收消息的缓存   
size_t msg_len:msg_ptr指向的缓存区的大小,必须大于等于msg_len属性指定的队列单条消息最大字节数    
unsigned int *msg_prio:如果不为NULL,则用于接收接收到消息的优先级
const struct timespec *abs_timeout:阻塞等待时的最晚时间节点
return:成功返回接收到的消息的字节数,失败返回EOF

例:

char *read_buf[100];
if (mq_timedreceive(mqd,read_buf,100,NULL,&time_info) == EOF) {
    perror("mq_timedreceive");
    exit(EXIT_FAILURE);
}

该api用于消除指定的消息队列

int mq_unlink(const char *name)
const char *name:消息队列名称
return:成功返回0,失败返回EOF    

例:

if (mq_unlink(mq_name) == EOF) {
	perror("mq_name");
    exit(EXIT_FAILURE);
}

clock_gettime

该api用于获取以struct timespec形式表示的clockid指定的时钟

int clock_gettime(clockid_t clockid, struct timespec *tp)
clockid_t clockid:特定时钟的标识符,常用的是CLOCK_REALTIME,表示当前真实时间的时钟
struct timespec *tp:用于接收时间信息的缓存
return:成功返回0,失败返回EOF    

例:

struct timespec time_info;
clock_gettime(CLOCK_REALTIME,time_info);

标签:返回,常用,const,EOF,int,char,api,进程
From: https://www.cnblogs.com/alin250017/p/18357437

相关文章

  • TapData 信创数据源 | 国产信创数据库 PolarDB MySQL 数据同步指南,加速国产化进程,推进
    随着国家对自主可控的日益重视,目前在各个行业和区域中面临越来越多的国产化,采用有自主知识产权的国产数据库正在成为主流。长期以来,作为拥有纯国产自研背景的TapData,自是非常重视对于更多国产信创数据库的数据连接器支持,旗下产品已陆续与**阿里云、华为云、麒麟软件、优炫数据库......
  • VL01N/VL02N/VL09 BAPI
    1.VL01NFUNCTIONzfmsd_create_dn.*"----------------------------------------------------------------------*"*"本地接口:*"IMPORTING*"VALUE(SHIP_POINT)TYPEBAPIDLVCREATEHEADER-SHIP_POINTOPTIONAL*"VALUE(DUE_DATE)......
  • API 设计 实践
    深度|API设计最佳实践的思考https://mp.weixin.qq.com/s/qWrSyzJ54YEw8sLCxAEKlA 深度|API设计最佳实践的思考谷朴 阿里云开发者 2019年05月09日08:10 阿里妹导读:API是模块或者子系统之间交互的接口定义。好的系统架构离不开好的API设计,而一个设计不够完善的......
  • 短信接口-短信API-短信发送
    接口简介:短信验证码api,营销短信群发功能,群发短信可自动过滤无效号码后再发送。节约运营成本,每超过70个字符按一条短信计费。通过后台添加签名,再添加模版接口地址:https://www.wapi.cn/api_detail/86/204.html批量功能:https://www.wapi.cn/batch/detail_86.html网站地址:htt......
  • Apifox 深度分析:为什么它是不可错过的 API 管理平台
    无论是大型企业还是初创公司,高效的API管理都是确保业务顺利运行的重要环节。然而,随着项目规模的扩大和团队的壮大,API的设计、开发、测试和文档管理往往变得越来越复杂。 市面上确实有不少API管理工具或者说API管理平台,比如大家熟知的Postman、Swagger等。但是,这些工......
  • 破防了!加班狗常用的TOP4 PDF编辑器2024年集锦
    我们天天都得跟一堆文件打交道,尤其是PDF文件。PDF的好处是,不管在哪个设备上打开,内容和格式都保持原样,而且不容易被改。不过,有时候这也让人挺头疼的,因为想改点什么就麻烦了。幸好,技术一直在进步,现在市面上有很多好用的PDF编辑器,它们就像魔法棒,让编辑文档变得轻松又快速。今天,我......
  • Java String常用类、数组、日期时间
    JavaString类一、创建字符串1、简单方式:Stringstr="seventeen";2、用构造函数创建字符串:Stringstr2=newString("seventeen");String创建的字符串存储在公共池中,而new创建的字符串对象在堆上String类是不可改变的,所以一旦创建了String对象,那它的值就无法改变了如果需......
  • Linux网络通信基础API
    这篇文章只有Linux网络通信基础API大参数信息,和返回值,这篇文章并没有这些基础API的参数类型介绍。accept的第二个参数可以查看客户端信息。创建socket#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>intsocket(intdomain......
  • VF01/VF02/VF03屏幕增强及BAPI增强字段处理
    1.在销售发票抬头表中增加增强字段2.创建处理程序主程序SAPMV60A中的所有包含文件都是以MV60AF打头的,所以我们创建一个独立的程序SE38(ZSDU0001) 来存放所有的处理代码 创建屏幕9001,确保屏幕类型为子屏幕 屏幕字段可从VBRK表中获取*&---------------------------......
  • 用 Python示例,怎么利用电商api来制定营销策略!
    以下是一个更完整的示例代码,用于使用电商API数据来制定营销策略。在这个示例中,我们不仅获取最畅销的商品,还获取不同价格段的销售分布,以制定更全面的营销策略:importrequestsimportjson#假设这是获取商品销售数据的API端点api_endpoint="https://example-ecommerce-......