Linux是一个多用户多任务的操作系统,可以同时运行多个用户的多个程序,就必然会产生多进程,而每个进程都会有不同的状态。Linux的进程有以下6种状态:
D:不可中断的深度睡眠状态,处于这种状态的进程不能响应异步信号;
R:进程处于运行态或就绪状态,只有在改状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态;
S:可中断的睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂起;
T:暂停状态或跟踪状态;
X:退出状态,进程即将被销毁;
Z:退出状态,进程成为僵尸进程;
Linux系统使用ps -aux命令可观察到进程的当前状态,STAT列的第一个字符显示的是进程的状态,可以看到大部分进程处于S状态。
main函数
进程创建后通常调用exec族函数来装载程序文件的可执行映像,并在完成装载后调用程序的main()函数。在C程序中,main()函数通常是程序的执行起始点,有3种原型定义:
Int main()
Int main(int argc, char* argv[])
Int main(int argc, char* argv[], char* env[])
创建进程
Linux系统使用fork()函数来创建一个新进程。fork()函数的原型如下:
#include <unistd.h>
pid_t fork(void);
fork()函数从运行这的进程中分裂出一个子进程,它通过拷贝父进程的方式创建子进程。子进程与父进程有相同的代码空间、文件描述符等资源。
进程创建后,子进程与父进程开始并发执行,执行顺序由内核调度算法来决定。
fork()函数如果成功创建了进程,就会对父子进程各返回一次,其中对父进程返回子进程的PID,对子进程返回0;失败则返回小于0的错误码。
#Include <stdio.h> #Include <unistd.h> #include <stdlib.h> int main(int argc, char * argv[]) { pid_t pid; pid = fork(); if(pid==0) { printf("Here is child, my pid = %d, parents pid = %d\n", getpid(), getppid() ); } else if(pid > 0) { printf("Here is parent, my pid = %d, child's pid = %d\n", getpid(), pid); } else { perror("fork error\n"); } return 0; }