#**include** <stdio.h>
#**include** <stdlib.h>
#**include** <unistd.h>
**int** main(**void**)
{
printf("%d %d %d\n",getpid(), /*进程ID*/
getpgrp(), /*进程组ID*/
getppid()); /*父进程ID*/
printf("%d %d %d %d\n",getuid(), /*进程实际用户ID*/
geteuid(), /*进程有效用户ID*/
getgid(), /*进程实际组ID*/
getegid()); /*进程有效组ID*/
}
输出为:
{ ~ } » a.exe
5088 5088 6020
197108 197108 197121 197121
{ ~ } » **ps**
PID PPID PGID WINPID TTY UID STIME COMMAND
5740 6020 5740 704 pty0 197108 14:42:50 /usr/bin/**ps**
6020 4984 6020 6124 pty0 197108 14:26:10 /usr/bin/bash
4984 1 4984 4984 ? 197108 14:26:09 /usr/bin/mintty
{ ~ } » id
uid=197108(Administrator) gid=197121(None) groups=197121(None),114(本地帐户和管理员组成员),197609(HelpLibraryUpdaters),544(Administrators),545(Users),4(INTERACTIVE),66049(控制台登录),11(Authenticated Users),15(This Organization),113(本地帐户),4095(CurrentSession),66048(LOCAL),262154(NTLM Authentication),405504(High Mandatory Level)
进程号为:5672 父进程为:6020 (bash)
用户uid: 197108 用户gid: 197121
获取环境变量
1.env命令
{ ~ } » env
HOMEPATH=\Users\Administrator
DISABLE_CHECK_ON_STARTUP=false
APPDATA=C:\Users\Administrator\AppData\Roaming
ProgramW6432=C:\Program Files
HOSTNAME=Lu
...
2.environ全局变量
#**include** <stdio.h>
#**include** <stdlib.h>
#**include** <unistd.h>
3.getenv()函数
**char*** name = "COMPUTERNAME";
printf("%s\n",getenv(name)); //若没有键值为name,返回NULL
进程创建
#**include** <stdio.h>
#**include** <stdlib.h>
#**include** <unistd.h>
printf("ppid = %d, cpid = %d\n",getpid(),pid);
**else** **if**(pid == 0) /*子进程*/
{
printf("cpid = %d\n",getpid()); //子进程id
i++;
}
**else**
printf("fork error");
printf("pid = %d, i = %d\n",getpid(),i); //父进程id
}
输出为:
{ ~ } » a.exe
process start: pid = 1308, i = 0
cpid = 6372
process end: pid = 6372, i = 1
ppid = 1308, cpid = 6372
process end: pid = 1308, i = 0
两次执行结果并不相同,说明子进程跟父进程并无先后关系,在fork之后是并行的。
调用执行程序
1.exec
2.fork-exec
3.vfork-exec(高效,shell实际操作方式)
**if**(pid=vfork() == 0) //子进程
{
execl("/bin/ls","-l");
}
4.system
system("/bin/ls -l");
vfork和fork
1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。
进程休眠
sleep(1000); //1000秒
进程终止
exit(0); //退出
//1\. exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统;而return 是退出当前函数,返回函数值,把控制权交给调用函数。
//2\. exit是系统调用级别,它表示一个进程的结束;而return 是语言级别的,它表示调用堆栈的返回。
#**include** <stdio.h>
#**include** <unistd.h>
{ ~ } » a.exe
pid = 6760 //子进程号= 6760 ,退出号=2
pid = 4140, wait_pid = 6760, status = 512 //父进程号 = 4140, 等待子进程结束,status = exitno << 8;
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")