本来想现在Linux上熟悉下进程的有关概念然后去写windowsSDK的,没想到今天Windows蓝屏了,新升级的3.2.2内核打开虚拟机的时候还要升级内核。升就升吧,没想到还错误了。没办法,看来只好在Linux上面待着了。这几天自己只是熟悉了下进程的概念,然后简单的写了一些小程序。自己写点笔记免的忘掉。进程标识符:Linux环境下进程启动时候,系统分配给一个唯一的数值给每个进程,这个数值就称为进程标识符。(感觉跟windows里面的句柄有点像)进程表示有进程号 PID 和 父进程号 PPID,都是非0整数使用函数getpid获得当前进程号,函数原型Pid_t getpid(void);
使用函数getppid获得当前进程的父进程号函数原型Pid_t getppid(void);
下面介绍LinuxC下与进程相关的函数exec函数族 在进程中启动另一个程序执行这个函数族有6个成员exec函数族函数原型#include <unistd.h>int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char *const envp[]);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);int execve(const char *path, char *const argv[], char *const envp[]);其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。 system 在进程中开始另一个进程 函数原型
#i nclude<stdlib.h>
int system(const char * string); 函数说明
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间 SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值
=-1:出现错误
=0:调用成功但是没有出现子进程
>0:成功退出的子进程的id
fork 从已存在的进程中复制一个新进程(这个进程叫做原来父进程的子进程) 这是个关键的函数,理解了这个函数也就是进程入门了吧,呵呵 废话不多说,先来看看函数原型: #
include<unistd.h> #
include<sys/types.h>
pid_t fork(
void); (pid_t 是一个宏定义,其实质是int 被定义在#
include<
sys/types.h>中)返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1 函数说明: 一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。 子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。 Linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。我当初一直难以理解的fork函数的返回值。先看下示例代码:
[cpp] - #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
-
- int main()
- {
- //unsigned int result;
- pid_t result;
- result=fork();
- int newret;
- if (result==-1)
- {
- perror("创建子进程失败");
- exit;
- }
- else if (result == 0)
- {
- printf("返回值是:%d,说明这是子进程!
此进程的进程号(PID)是:%d
此进程的父进程号(PPID)是:%d
",result,getpid(),getppid());
- newret = system("ls -l");
- }
- else
- {
- sleep(10);
- printf("返回值是:%d,说明这是父进程!
此进程的进程号(PID)是:%d
此进程的父进程号(PPID)是:%d
",result,getpid(),getppid());
- newret = system("ping www.baidu.com");
- }
- return 0;
- }
Linux和Windows中的时间管理Linux tar 如何在压缩之后删除原文件及相关拓展用法相关资讯 Linux基础知识
- Linux基础知识之文件权限详解 (08月09日)
- Linux基础知识之ls与文件名通配详 (08月01日)
- Linux基础知识之history的详细说明 (07月31日)
| - Linux基础知识之文件管理命令(cp、 (08月09日)
- Linux基础知识之man手册的使用 (07月31日)
- Linux基础知识之文件的时间戳及 (07月31日)
|
本文评论 查看全部评论 (0)