Linux API-进程:getpid、getppid、exit、wait、fork、vfork、execl、execv、system、popen

相关指令

ps —— 查看系统中有哪些进程
ps -aux —— 查看系统中全部进程
ps -aux|grep A —— 查找A进程
top —— 任务管理器界面

一、getpid——取得进程识别码

1.原函数

表头文件
#include "unistd.h"
定义函数
pid_t getpid(void);

函数说明——getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
返回值——目前进程的进程识别码

2.示例

#include "unistd.h"
#include "stdio.h"
 
int main(int argc, char const *argv[])
{
    printf("pid=%d\n", getpid());
    return 0;
}

运行结果:结果仅供参考
pid=17694

二、getppid——取得父进程的进程识别码

1.原函数

表头文件
#include "unistd.h"
定义函数
pid_t getppid(void);

函数说明——用来取得目前进程的父进程识别码
返回值——目前进程的父进程识别码

2.示例

#include "unistd.h"
#include "stdio.h"
 
int main(int argc, char const *argv[])
{
    printf("My parent id=%d\n", getppid());
    return 0;
}

运行结果:My parent id=17800

三、exit——正常结束进程

1.原函数

表头文件
#include "stdlib.h"
定义函数
void exit(int status);

函数说明——exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而该进程所有的缓冲区数据会自动写回并关闭未关闭的文件
status——返回给父进程的参数
返回值——无

四、wait——等待子进程中断或结束

1.原函数

表头文件
#include "sys/types.h"
#include "sys/wait.h"
定义函数
pid_t wait (int *status);

函数说明——wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束
status——子进程的结束状态值(exit里面这个值)
返回值——成功则返回子进程识别码(PID)。错误返回-1,错误原因存于errno中

五、fork——建立一个新子进程

1.原函数

表头文件
#include <sys/types.h>
#include <unistd.h>
定义函数
pid_t fork(void);

函数说明——在父进程将fork() 后续代码拷贝一份给子进程,两进程的数据不互相影响并且同时运行
返回值——为0 代表当前进程为子进程。非负数代表当前进程为父进程。-1 —— 调用失败

2.示例

#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"

int main()
{
        pid_t id=fork();//建立子进程

        if(id>0)//父进程可进入执行的代码
        {
                wait(NULL);//等待子进程退出
                printf("father,id=%d\n",getpid());
        }
        if(id==0)//子进程可进入执行的代码
        {
                printf("son,id=%d\n",getpid());
                exit(1);//正常退出
        }

        printf("OK\n");
        return 0;
}

运行结果
father,id=55877
OK
son,id=55878
OK

六、vfork——建立一个新的子进程

1.原函数

表头文件
#include "unistd.h"
定义函数
pid_t vfork(void);

函数说明——vfork()会产生一个新的子进程,直接使用父进程存储空间,不拷贝,同时保证子进程运行并退出后,父进程执行
返回值——vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork失败则直接返回-1,失败原因存于errno中
另外纤细的函数说明——其子进程会复制父进程的数据与堆栈空间,,Linux使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号

2.示例

#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"

int main()
{
		int a=0;
        pid_t id=vfork();//建立子进程

        if(id>0)//父进程可进入执行的代码
        {
                wait(NULL);//等待子进程退出
                printf("a=%d\n",a);
                printf("father,id=%d\n",getpid());
        }
        if(id==0)//子进程可进入执行的代码
        {
        		a=1;
                printf("son,id=%d\n",getpid());
                sleep(5);
                exit(1);//正常退出
        }

        printf("OK\n");
        return 0;
}

运行结果
son,id=56138
a=1
father,id=56137
OK

七、execl——执行文件

1.原函数

表头文件
#include "unistd.h"
定义函数
int execl(const char *path, const char *arg, ...);

函数说明——execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束
path——文件路径字符串
arg——执行文件传递的参数
返回值——成功不会返回。失败返回-1,失败原因存于errno中

2.示例

#include <stdio.h>
#include "unistd.h"

int main()
{
        int cp=execl("/bin/ls","ls",NULL);//执行路径/bin/ls的内容,参数为ls,所以意思相当于是执行ls指令

        printf("return?,cp=%d\n",cp);//如果execl执行成功则不会执行此条语句

        return 0;
}

运行结果:ls指令:列出当前文件夹下有哪些文件

八、execv——执行文件

1.原函数
表头文件

#include "unistd.h"
定义函数
int execv(const char *path, char *const argv[]);

函数说明——execv()用来执行参数path字符串所代表的文件路径
path——文件路径字符串
argv——利用数组指针来传递给执行文件
返回值——成功不会返回。失败返回-1,失败原因存于errno 中

2.示例

#include <stdio.h>
#include "unistd.h"

int main()
{
        char *argv[]={"ls"};
        int cp=execv("/bin/ls",argv);//执行路径/bin/ls的内容,参数为argv,所以意思相当于是执行ls指令

        printf("cp=%d\n",cp);//如果execv执行成功则不会执行此条语句

        return 0;
}

运行结果:ls指令:列出当前文件夹下有哪些文件

九、system——执行shell 命令

1.原函数

表头文件
#include "stdlib.h"
定义函数
int system(const char *string);

函数说明——system()会调用fork()产生子进程,子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程
string——执行的字符串命名
返回值——
1:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1
2:若参数string为空指针(NULL),则返回非零值
3:如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功

2.示例

#include <stdio.h>
#include "stdlib.h"

int main()
{
        int cp=system("ls");//执行shell指令:ls执行

        printf("cp=%d\n",cp);

        return 0;
}

运行结果
ls指令:列出当前文件夹下有哪些文件
cp=0

十、popen——建立管道I/O

1.原函数

表头文件
#include "stdio.h"
定义函数
FILE * popen( const char * command,const char * type);

函数说明——popen()会调用fork()产生子进程,然后从子进程调用/bin/sh -c来执行参数command的指令
command——执行的字符串指令
type——可使用“r”代表读取,“w”代表写入
返回值——成功则返回文件指针。错误返回NULL,错误原因存于errno中

2.示例

#include <stdio.h>
#include <string.h>

int main()
{
        FILE *fp=popen("/home/CLC/b","r");//执行b指令
        printf("1 fp=%p\n",fp);//输出b指令对应的文件指针

        char data[30]={"\0"};
        fread(data,sizeof(char),30,fp);//读取fd文件对应的b指令运行结果
        printf("1 data=%s\n",data);//输出b指令运行的结果


        fp=popen("/bin/ls","r");//执行ls指令
        printf("2 fp=%p\n",fp);//输出ls指令对应的文件指针

        memset(data,'0',strlen(data));//将data数组清零
        fread(data,sizeof(char),30,fp);//读取fd文件对应的ls指令运行结果
        printf("2 data=%s\n",data);//输出ls指令运行的结果


        return 0;
}

运行结果

1 fp=指令b对应的文件指针
1 data=结果是运行b(文件编译后生成的指令)这个指令后生成的内容
2 fp=/bin/ls对应的文件指针
2 data=结果是指令ls输出的内容

喜欢的请点赞加关注,谢谢你

上一篇:把EXECL表格导入到WORD中


下一篇:(4.21)sql server中复制查询结果集