unix 环境高级编程-1.6-程序和进程

本文深入探讨了程序与进程的概念,包括程序的定义、进程的执行过程及标识符,以及进程控制的基本函数。同时,介绍了线程和线程ID的概念,讨论了如何在进程内进行线程管理。此外,文章还涉及了程序的执行方式、多线程编程实例及共享资源的同步问题。

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

1.6、程序和进程

  1. 程序:存放在磁盘上,处于某个目录中的可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使之执行。
  2. 进程和进程id:程序的执行被称为进程(process)。unix确保每个进程都有一个唯一的数字标识符。称为进程ID。进程id总是非负数。

看如下例子:pro_1-4.c

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


编译:gcc -o pro_1-4 pro_1-4.c

运行:./pro_1-4

结果:

3.进程控制:有三个用于进程控制的主要函数:fork,exec,和waitpid。(exec有六种变体);

示例:程序pro_1-5.c

#include "apue.h" #include <sys/wait.h> int main(void) { char buf[MAXLINE]; pid_t pid; int status; printf("%%");//print prompt while(fgets(buf,MAXLINE,stdin)!=NULL){ if(buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]=0; if((pid=fork())<0) { err_sys("fork error"); }else if(pid=0){ execlp(buf,buf,(char*)0); err_ret("couldn't execute:%",buf); exit(127); } if((pid=waitpid(pid,&status,0))<0) err_sys("waitpid error"); printf("%%"); } exit(0); }

运行结果:

程序解释:

  • 函数fgets从标准一行行的读,一终止符结束,fgets返回一个null指针,循环终止,进程终止。
  • fgets是以换行符终止,后随一个null字节,所以用strlen计算长度。二execlp要求一null换行。
  • fork创建一个新进程。新进程是调用进程的复制品,调用进程是父进程。新创建的为子进程。fork像父进程返回进程ID,子进程则返回0,以内fork创建一新进程。所以说,他被调用一次,但返回两次。

4.线程和线程ID

通常,一个进程只有一个控制线程。同一时刻只执行一组机器指令。对于某些问题,如果不同部分,个使用一个控制线程。那么整个问题解决起来就容易多了。

在一个进程内所有线程,共享一个地址空间,文件描述符,栈以及进程相关的属,因为,他们能访问同意存储区,所以个线程在访问共享数据的同时,需要采取同步措施,避免数据不一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值