Linux操作系统——与进程相关的系统调用及其应用

每个系统调用在返回时除了返回正常值外,还要返回错误码。Linux为了防止与正常的返回值混淆,并不直接返回错误码,而是将错误码放入一个名为errno的全局变量中。如果一个系统调用失败,可以读出errno的值来确定问题所在。errno不同数值所代表的错误消息定义在errno.h中。

一、fork系统调用

fork可能有以下三种不同的返回值。

1、父进程中,fork返回新创建子进程的进程ID。

2、子进程中,fork返回0。

3、如果出现错误,fork返回一个负值。

备注:

fork出错可能有两种原因:1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN;2)系统内存不足,这时errno的值被设置为ENOMEM。

fork系统调用出错的可能性很小,如果出错,一般都为第一种错误。如果出现第二种错误,说明系统已经没有可分配的内存。正处于崩溃的边缘。

二、exec系统调用

exec函数族的作用是根据指定的文件名找到可执行文件,就是在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。

三、wait系统调用

进程一旦调用wait,立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,释放PCB,并把它彻底销毁后返回;如果没有找到一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

1、参数为空

其中参数用来保存被收集进程退出时的状态,但如果对这个子进程如何死掉毫不在意,只想把这个僵尸进程消灭,可以设定这个参数为NULL。

pid = wait(NULL);

如果成功,wait返回被收集的子进程的进程ID,如果调用进程没有子进程,调用会失败,wait返回-1,同时设置errono被设置为ECHILD。

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

int main(void)
{
    pid_t pc, pr;

    pc = fork();
    if(pc < 0)// 如果出错
        printf("error ocurred\n");
    else if(pc == 0){// 如果是子进程
        printf("This is child process with pid of %d\n", getpid());
        sleep(10);
    }else{ // 如果是父进程
        pr = wait(NULL);
        printf("I catched a child process with pid of %d\n", pr);
    }
    exit(0);
    
    return 0;
}

./a.out 
This is child process with pid of 18849
I catched a child process with pid of 18849

2、参数不为空

如果参数status的值不为NULL,wait会把子进程退出时的状态取出并存入其中,指出子进程是正常退出还是被非正常结束,以及正常结束时的返回值,或被哪个信号结束的等信息。

三、exit系统调用

这个系统调用是用来终止一个进程的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值