您的位置:首页 > 运维架构 > Linux

linux 复习杂记(一) linux中的进程

2016-03-12 16:49 232 查看
1.父进程与子进程拥有私有的内存映像,调用fork函数生成子进程之后,父进程对属于它的变量作出修改对于子进程来说是不可见的。但是,父进程和子进程是可以共享已经打开的文件的。如果一个文件在子进程创建之前被打开了,那么父进程对文件内容作出了修改,对于子进程来说是可见的。

2.fork函数会返回两次,一个是返回给父进程的,返回值是子进程的id。一个是返回给子进程的,返回值是0。子进程可以通过getpid函数获取自己的进程号。

3.进程间可以通过管道来进行进程间通信。一个进程往管道写入字节流,另一个进程可以通过管道读取字节流。如果一个管道是空的,那么读取消息的进程会被挂起,直到有可用的数据为止。

4.另一种进程间通信方式是软件中断--即信号。一个进程可以给在同一个进程组的进程发送信号。对于一个信号,进程可以选择忽略它、获取它或者利用这个信号杀死某个进程。如果想获取它,必须指定一个信号处理函数。

5.如果通过fork函数创建了子进程,那么子进程中止的时候需要父进程调用wait函数或者waitpid函数来处理。如果子进程中止的时候而父进程没有调用wait或者waitpid来等待它,子进程会进入僵死状态,直到父进程调用wait或者waitpid来等待它,才会结束。waitpid有三个参数,第一个是子进程的id,如果是-1,那么任意一个终止的子进程结束的时候都会调用waitpid来成功结束。第二个参数是用于记录子进程返回的状态,是一个引用值传进去的。第三个参数决定如果没有子进程结束运行的时候,调用者是阻塞还是返回。函数原型是waitpid(pid,&statloc,opts);

6.父进程调用了fork创建子进程之后,可以使用exec函数来用一个可执行文件替代子进程原来的核心映像,从而运行相应的功能。exec执行的可运行文件最后的exit函数的参数会传递给waitpid的第二个参数。

7.可以通过sigaction来指定一个信号处理函数。sigaction的第一个参数是需要捕捉的信号,第二个是指向一个特定Struct类型的指针,用于指定一个信号处理函数和一些其他的位和标志。第三个也是和第二个参数一样类型的结构的指针,用于返回信息。

8.一些按键和调用kill函数都可以发送信号(kill函数除了用于杀死一个进程也是可以发送其他信号的~)。

9.在一段时间内,对于信号来说是不排队的。意思就是,如果同时有几个进程发送了同一个信号,其他来接受这个信号的函数,只会收到一次这个信号。(这个是参考Unix网络编程:“如果一个信号在被阻塞期间产生了一次或多次,那么该信号被解阻塞之后通常只递交一次,也就是说Unix信号默认是不排队的。”)

10.在linux中,使用结构体task_struct来表示一个任务。而且,无论是进程还是线程,都是用这个结构体。所以,一个单线程进程只有一个task_struct,而多线程进程会有多个task_struct。一个进程可以通过pid(进程号)来映射到相应的task_struct,来获取相应的进程信息。task_struct是保存在内存当中。需要注意的是,linux采用的是写时复制,就是调用fork函数之后,虽然子进程和父进程的虚拟内存空间是不同的,但是实际物理内存空间是相同的,只有在内存中的内容发生变化的时候,才进行真正的内容复制。这样可以节省很多RAM。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: