进程控制常用的一些操作
来源:互联网 发布:java项目部署到tomcat 编辑:程序博客网 时间:2024/06/03 14:37
1、获取进程的id
int main0(){ printf ("当前进程 ID %d\n", getpid()); printf ("当前父进程:%d\n", getppid()); printf ("当前用户: %d\n", getuid()); while (1); return 0;}
2、fork 和 vfork之前的博客里有,这里就不啰嗦了
// forkint main1(){ // fork : 创建一个子进程 // 如果创建失败,返回-1 // 成功返回两个值,如果是在父进程,返回子进程的ID // 如果是在子进程,返回值是0 pid_t pid = fork(); if (-1 == pid) { perror ("fork"); return -1; } if (pid > 0) // 父进程 { printf ("我是父进程,pid = %d\n", getpid()); } else // 子进程 { printf ("我是子进程,pid = %d\n", getpid()); } while (1); return 0;}// fork1 父进程和子进程是异步的,输出都是1int main2(){ int count = 0; pid_t pid = fork(); count++; printf ("count = %d\n", count); return 0;}// fork2 会产生8个进程int main3(){ fork(); fork(); fork(); printf ("a\n"); while (1); return 0;}// fork3 产生20个进程int main4(){ fork(); // 产生2个进程 fork() && fork() || fork(); // 之前的每个进程都会产生5个进程 fork(); // 翻倍 printf ("a\n"); while (1); return 0;}// 1、vfork 的子进程必须要显示调用 exit();// 2、vfork 子进程和父进程共享数据段// 3、vfork 的子进程先于父进程执行,子进程执行完,CPU才能调度到父进程int main5(){ int count = 0; pid_t pid = vfork(); if (pid < 0) { perror ("vfork"); return -1; } count++; if (pid > 0) // 父进程 { printf ("我是父进程,pid = %d count = %d\n", getpid(), count); } else // 子进程 { printf ("我是子进程:pid = %d count = %d\n", getpid(), count); while (1); exit (0); } return 0;}
3、exec函数族
// execl 格式:int execl(const char * path, const char* arg1,...)int main6(){ // 第一个参数需要一个路径,能够找到需要执行的文件 // 后面的参数表明执行的方式,和在终端方式类似,如果程序执行需要 // 其他的参数 ls -l,参数要作为函数的实参传过去 // 最后需要补一个 NULL int ret = execl ("/bin/ls", "ls", NULL); if (-1 == ret) { perror ("exexl"); return -1; } return 0;}int main7(){ // 产生一个新的程序,替换了原有的程序,原有的进程 id 是不变的 // int ret = execl ("bin/ls", "ls", "-l", NULL); int ret = execl ("/bin/ps", "ps", "-ef", NULL); if (-1 == ret) { perror ("execl"); return -1; } printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); return 0;}// execv 格式:int execv(const char * path, const char *argv[])int main8(){ char* a[] = {"file.c", NULL}; int ret = execv("file", a); if (-1 == ret) { perror ("execl"); return -1; } return 0;}// execlp 格式:int execlp(const char * path, const char* arg1,...)int main9(){ int ret = execlp ("./file", "file", NULL); if (-1 == ret) { perror ("execl"); return -1; } return 0;}int main10(){ int ret = execlp ("ls", "ls", "-l", NULL); if (-1 == ret) { perror ("execl"); return -1; } printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); return 0;}// systemint main11(){ printf ("请选择文件:\n"); system ("ls /home"); char str[100]; while (1) { fgets (str, 100, stdin); printf ("[root@promote 15]# "); system (str); } return 0;}int main12(){ printf ("hello world\n"); sleep (1); // 在内部fork()一个子进程,调用 /bin/sh -c string来执行 system ("ps -ef | grep a.out"); printf ("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); return 0;}
4、进程的终止
// 进程退出void func(){ printf ("33333333333333333333333\n"); exit (0); // 进程终止}int main13(){ printf ("hello\n"); printf ("1111111111111111"); // 在停止进程前,要检查文件的打开情况,并把文件缓冲区中 // 的内容写回文件才停止进程 exit (0); return 0;}int main14(){ printf ("hello\n"); printf ("11111111111111111"); // _exit:直接使进程停止,清除其使用的内存,并清除缓冲区中内容 _exit (0); return 0;}
阅读全文
1 0
- 进程控制常用的一些操作
- linux进程的一些操作
- mysql 的一些常用操作
- 单链表的一些常用操作
- 数组的一些常用操作
- oracle的一些常用操作
- Oracle的一些常用操作
- Jquery 的一些常用操作
- 枚举的一些常用操作
- Bitmap的一些常用操作
- NSFileManager常用的一些操作
- git常用的一些操作
- postgresql的一些常用操作
- 枚举的一些常用操作
- ORACLE的一些常用操作
- jquery的一些常用操作
- 一些常用的AHK操作
- multimap的一些常用操作
- Java学习(九)
- libiconv Qt中的各种字符编码转化
- Buy Tickets (线段树)单点更新
- SSM整合 -- Spring和Mybatis的配置文件详解
- 第一天
- 进程控制常用的一些操作
- 密码破译问题:地球和天女星座开战了,你是地球防卫军的密码破解员,以下你是破解出来的部分密码 tyt:好 huy:这 bvn:天 jkl :是 lgc:你 qqq:哈
- 内核编译不能找到standby.code错误解决办法
- python中的 while True
- 路径寻找问题:八数码问题
- opencv在CLion下CMakeList配置
- 想转型成为用户体验设计师,先看看这些再说
- 【SpringCloud】(十):高可用 Eureka
- 将SM2加密库从vs2008移植到vs2015上时报错