UNIX环境高级编程_01_进程和出错处理

本文介绍了程序的概念及如何通过exec函数在内存中执行程序。通过实例演示了如何使用C语言实现简单的bash命令执行,包括如何获取进程ID及处理常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.6程序和进程:

1.程序:

program是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数将程序读入内存,并执行程序。

#include <apue.h>
int main()
{
    printf("hello world from process ID %ld\n",(long)getpid());
    exit(0);
}

getpid 得到其进程的ID,返回一个pid_t数据类型。因为我们不知道它的大小,所以我们尽可能的强制类型转化为它可能用到的最大的数据类型。常整型可以提高可移植性。

实例1_7:简答的,模仿系统执行bash命令。

#include <apue.h>
#include <sys/wait.h>

int main()
{
    char buf[MAXLINE];
    pid_t  pid;
    int status;
    printf("%% ");
    while(fgets(buf,MAXLINE,stdin)!=NULL)
    {
        if(buf[strlen(buf)-1]!='\0')
            buf[strlen(buf)-1]='\0';
        if((pid=fork())<0){
            err_sys("fork_error");
           } else if(pid==0) {
                execlp(buf,buf,(char *)0);
                err_ret("could't execute: %s",buf);
                exit(127);
            }
        
        if((pid=waitpid(pid,&status,0))<0)
        {
            err_sys("waitpid error");
        }
        printf("%% ");
    }
    exit(0);

}

关于本程序注意的点有:

1,fgets从标准输入一次读取一行。当键入文件结束符(通常是ctrl+D)作为行的第一个字符时,fgets返回一个null 指针,于是循环停止,进程也就终止(具体讲解在第18章)。

2,因为fget获取的字符串都是以'\n'即换行符结束的,所以我们将'\n'替换为C语言字符串标准结尾'\0',函数execlp要求传入的参数是以'\0'结尾的字符串。

3,该程序的缺陷是不能向命令添加参数只能执行简单的ls命令,而不能执行ls -a命令等。如果要这么做必须将输入的字符串分割,然后再以某种约定将参数分割开来,用空格或者制表符等。

1_7出错处理:

系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。

ex:open函数如果成功执行则返回一个非负的文件描述符。如出错怎返回-1.在open出错时,有大约15种不同的errno值(文件不存在,权限问题等)。

对于errno有俩条规则:

第一,如果没有出错,如果没有出错,其值不会被例程清除,仅当函数的返回值指明出错时,才校验其值。

第二,任何函数不会将errno设置为0。

C标准定义俩个函数,它们用于打印出错信息

#include <string.h>
char *strerror(int errnum);

strerror函数将errnum(errno)映射为一个出错消息字符串,并且返回此字符串的指针。

#include <stdio.h>
void perror(const char *msg);

perror函数基于errno的当前值,在标准错误上产生一条出错消息,然后返回。

它首先输出由msg指向的字符串,然后时一个冒号,一个空格,接着时对应于errno值得出错消息,然后是一个换行符。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值