进程作为资源分配和调度的基本单元,当进程被引进来后,线程作为系统调度执行的基本单元。
与进程不同,同一进程的各个线程可以共享资源。
linux运行中有就绪(Waiting),执行(Running)和停止(Stopped)三种基本状态。此外,linux还会产生一种不受欢迎的状态:僵死(Zombie)状态,通常称为Z状态。处于Z状态的进程已经死亡,但没有释放系统资源,包括内存和一些系统表等。在Linux操作系统中要手动清除处于Z状态的进程。
#include <stdio.h> #include <unistd.h> int main() { //获取自身所运行的进程ID printf("%d\n",(int)getpid()); //获取父进程ID printf("%d\n",(int)getppid()); return 0; }
创建进程:
pid_t fork();
ps命令:确定有哪些进程正在运行以及运行的状态。
ps a 显示当前终端机的程序 ps -A 显示所有程序 ps c 列出程序,并显示详细信息 ps e 列出程序,显示环境变量 ps -H 显示树状结构,表示结构之间的相互关系 ps -N 显示所有程序,除了执行PS终端机下的程序之外 ps s 采用程序信号的格式显示程序状况 ps u 以用户为主的格式来显示程序状况 ps x 显示所有程序,不以终端机来区分
进程终止:
pid_t wait(int *status);
例子:
// fork.c #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(int argc, char **argv) { pid_t child_pid,pid; int status; child_pid=fork(); switch(child_pid) { case -1: printf("failed!\n"); break; case 0: printf("child pid is %d\n",(int)getpid()); break; default: printf("child pid is %d, parent pid is %d\n",(int)child_pid,(int)getpid()); //终止子进程 pid=wait(&status); if(WIFEXITED(status)) printf("child process exited with code %d\n",child_pid); else printf("child process terminated abnormally!\n"); break; } return 0; }
进程间通信:
在同一台计算机中的进程相互通信的方式主要有:管道(Pipe),信号(Signal),信号量(Semaphpre),消息队列(Message)和共享内存(Shared Memory)。
信号:
void (*signal(int signum, void (*handler)(int)))(int) //signum指出要设置处理方法的信号 //handler是要处理的函数
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) //signum为信号的值 //act指定了对特定信号的处理 //oldact保存原来相应的处理
可以通过kill -l命令来查看所有信号。
例子:
#include<signal.h> #include<unistd.h> #include<stdio.h> #include<sys/time.h> void signalHandle(int signal) { switch(signal) { case SIGHUP: printf("catch signal:sighup(%d)\n",signal); break; case SIGINT: printf("catch signal:sigint(%d)\n",signal); break; case SIGQUIT: printf("catch signal:sigquit(%d)\n",signal); break; case SIGALRM: printf("catch signal:sigalrm(%d)\n",signal); break; default: printf("unknow signal:%d",signal); break; } } int main() { int sec_delay=5; printf("current process id:%d\n",(int)getpid()); signal(SIGINT,signalHandle); signal(SIGQUIT,signalHandle); signal(SIGALRM,signalHandle); alarm(sec_delay); while(1) pause(); return 0; } //sighup-->ctrl+\ //sigint-->ctrl+c
管道:
管道分为普通管道(Pipe)和命名管道(FIFO)。它们都是通过内核缓冲区按先进先出的方式进行数据传输,管道一端顺序地写入数据,另一端顺序地读入数据。管道是半双工的,要进行双方通信,要建立两个管道。
主要介绍命名管道:
int mkfifo(const char* pathname, mode_t mode) //pathname为文件路径名 //mode设置新创建的FIFO文件的文件许可权控制位的值为指定的方式值。 //一般的文件的I/0函数,如read(),write(),close()等,都可以用于FIFO
例子:
未完待续~~~
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 * 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012