Linux 进程创建
Posted 庖丁解牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 进程创建相关的知识,希望对你有一定的参考价值。
一:system系统调用 #include <stdlib.h> int system(const char *string); system函数传递给/bin/sh -c 来执行string所指定的命令。 string中可以包含选项和参数 如果没有找到/bin/sh。函数返回127,如果出现其他错误返回-1,成功返回0,但如果string为NULL,返回一个非0值 system调用其他进程是通过shell调用其他进程,本程序进程与被调用的进程之间没有关系。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> int main(int arg, char * args[]) { system("ls -l"); return 0; }
二:fork系统调用 #include<unistd.h> pid_t fork(void); fork执行成功,向父进程返回子进程的PID,并向子进程返回0,这意味着fork即使只调用一次,也会返回两次。 fork创建的新进程是和父进程(除了PID和PPID)一样的副本。 父进程和子进程之间有点区别,子进程没有继承父进程的超时设置(使用alarm调用)、父进程创建的文件锁,或者未决信号。 但是子进程会继承父进程的文件描述符,内存空间大小,代码 你不能预计父进程是在他的子进程之前还是之后运行,他的执行是无序的,是异步的。 fork的异步行为意味着你不应该在子进程中执行依赖与父进程的代码,反之亦然。 fork调用可能失败,原因是系统上已经运行了太多进程,已经超过了允许他执行的最大进程数。 fork执行失败,会向父进程返回-1,而且不创建子进程。
fork执行成功,向父进程返回子进程的PID,向子进程返回0。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> int main(int arg, char * args[]) { pid_t child=fork(); if(child==-1) { printf("操作系统出错!\n"); return -1; } if(child==0) { //此时在子进程中 printf("child is begining!\n"); sleep(200); printf("child is end!\n"); }else { //此时在父进程中,child大于零,child的值就是子进程的PID printf("parent is begining!\n"); sleep(200); printf("parent is end!\n"); } /* 通过观察"/proc"下的父子进程,发现父子进程共用一段代码 */ return 0; }
以上是关于Linux 进程创建的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
java 简单的代码片段,展示如何将javaagent附加到运行JVM进程