Linux学习随手笔记--进程控制

一、进程创建

pid_t fork(void);
pid_t vfork(void);

调用fork()函数创建一个子进程,返回两个值,子进程返回值为0,父进程返回值为子进程的pid号。创建出来的子进程拷贝了父进程,即子进程获得了父进程的数据空间,堆和栈,但是他们不共享内存。
父子进程的运行顺序由内核调度决定。
函数vfork()创建的子进程与父进程共享内存并且子进程先运行。

       pid_t getpid(void);
       pid_t getppid(void);

上面的函数获取当前进程的pid,下面的函数获取父进程的pid。

二、进程退出

void exit(int status);

调用该函数退出进程,和_exit()函数不同的是,exit函数清理缓存,
与return不同的是,exit会将控制权给系统,return将控制权给另外一个函数。
通常情况下,参数status为0表示正常退出,为其他值时为异常退出。
如果子进程介绍但没有安全退出,则会变成僵死进程,系统不允许出现过多僵死进程(浪费系统资源)。
如果父进程在子进程前销毁,则该子进程会变成孤儿进程,由init进程来收养(init进程pid为1)。
三、进程等待

pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);

进程调用wait函数后,如果没有子进程直接返回错误,否则阻塞直至有一个子进程退出,则该进程收集子进程的退出状态
参数wstatus
如果不关心子进程退出状态,则将wstatus设置为NULL。
如收集子进程退出状态则该状态放入了wstatus指向的整形数中。

想获取状态调用一下宏
WIFEXITED(status)如果子进程正常退出返回非0值,否则返回0
WEXITSTATUS(status)如果WIFEXITED返回非0时,该宏可以获取子进程退出的状态码。

waitpid函数比wait函数多了两个参数,分析如下
参数pid:
pid>0时,只等待该pid的子进程,不管其他进程
pid=-1时,该函数和wait函数一样
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

参数options:
写入这个宏时WNOHANG,waitpid函数不会阻塞,其他的宏不太常用。

四、进程替换
当用fork()创建完子进程后,我们不希望子进程和父进程是一样的,从而出现了exce相关函数来进行替换,一般子进程内调用exce族函数用新的程序替换子进程,但pid不变。

int execl(const char *path, const char *arg, ...
                       /* (char  *) NULL */)
int execlp(const char *file, const char *arg, ...
                       /* (char  *) NULL */);
int execle(const char *path, const char *arg, ...
                       /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
                       char *const envp[]);

这些函数基本类似
path参数为路径,file参数为可执行文件或者shell
l系列的第二个参数为列表形式,以NULL结尾
v系列的为数组形式
以e结尾的需要添加环境变量

五、相关代码

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

int main()
{
        int cmd;
        int pid;
        while(1)
        {
                printf("please input the cmd\n");
                scanf("%d",&cmd);
                if(cmd == 1)
                {
                        pid = fork();
                        if(pid == 0)
                        {
                                execl("/home/wqx/myfile/demo1","",NULL);
                        }
                        else
                        {
                                wait(NULL);
                        }
                }
			    else
                {
                        printf("do nothing\n");
                        sleep(1);
                }
        }

        return 0;
}

该函数的功能是输入命令1时,运行demo1.
运行结果
在这里插入图片描述demo1文件为上一个博客的历程的可执行文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值