
linux 父进程创建子进程的例子
父进程为什么要创建子进程呢?前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用. #i nclude #i nclude pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid,int *stat_loc,int options); wait系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如果没有父进程没有子进程或者他的子进程已经结束了wait回立即返回.成功时(因一个子进程结束)wait将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc是子进程的退出状态.子进程调用exit,_exit 或者是return来设置这个值. 为了得到这个值Linux定义了几个宏来测试这个返回值. WIFEXITED:判断子进程退出值是非0 WEXITSTATUS:判断子进程的退出值(当子进程退出时非0). WIFSIGNALED:子进程由于有没有获得的信号而退出. WTERMSIG:子进程没有获得的信号号(在WIFSIGNALED为真时才有意义). waitpid等待指定的子进程直到子进程返回.如果pid为正值则等待指定的进程(pid).如果为0则等待任何一个组ID和调用者的组ID相同的进程.为-1时等同于wait调用.小于-1时等待任何一个组ID等于pid绝对值的进程. stat_loc和wait的意义一样. options可以决定父进程的状态.可以取两个值 WNOHANG:父进程立即返回当没有子进程存在时. WUNTACHED:当子进程结束时waitpid返回,但是子进程的退出状态不可得到. 父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系统调用exec族调用.exec族调用有着5个函数. #i nclude int execl(const char *path,const char *arg,…); int execlp(const char *file,const char *arg,…); int execle(const char *path,const char *arg,…); int execv(const char *path,char *const argv[]); int execvp(const char *file,char *const argv[]): exec族调用可以执行给定程序.关于exec族调用的详细解说可以参考系统手册(man execl). 下面我们来学习一个实例.注意编译的时候要加 -lm以便连接数学函数库. #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude void main(void) { pid_t child; int status; printf(”This will demostrate how to get child status\\\ ”); if((child=fork())==-1) { printf(”Fork Error :%s\\\ ”,strerror(errno)); exit(1); } else if(child==0) { int i; printf(”I am the child:%ld\\\ ”,getpid()); for(i=0;i<1000000;i++) sin(i); i=5; printf(”I exit with %d\\\ ”,i); exit(i); } while(((child=wait(&status))==-1)&(errno==EINTR)); if(child==-1) printf(”Wait Error:%s\\\ ”,strerror(errno)); else if(!status) printf(”Child %ld terminated normally return status is zero\\\ ”, child); else if(WIFEXITED(status)) printf(”Child %ld terminated normally return status is %d\\\ ”, child,WEXITSTATUS(status)); else if(WIFSIGNALED(status)) printf(”Child %ld terminated due to signal %d znot caught\\\ ”, child,WTERMSIG(status)); } strerror函数会返回一个指定的错误号的错误信息的字符串.
linux创建进程后,进程的pid如何分配,最好说出具体函数
你用了pthread库,在链接的时候要加上gcc -lpthread 1.c -o 1即可子进程(对应pid==0语句)调用pthread接口创建线程,在县城内将value赋值5,然后打印 CHILD: value=%d\\\ 此时value = 5父进程 (对应 pid > 0 语句),等待子进程执行完成后(wait语句),打印PARENT: value=%d\\\ ,此时value = 0 对于你补充问题的回答:线程是在子进程里创建的,它只改变了子进程的value (子进程和父进程的value处在不同的地址空间,互相没有关系,而子进程和它所创建的线程是在同一地址空间,所以线程可以改变子进程的value), 父进程没有创建线程,因此它的值不会被改变。
在 linux 系统中通过系统调用什么来进行进程的创建
该函数被调用一次,但返回两次。
子进程的返回值是0,父进程的返回值则是子进程的进程I D。
子进程复制父进程的地址空间,文件描述符等。
这种复制是copy-on-write。
子进程不继承父进程的锁。
通常在fork()之后,会调用exec函数族,这样子进程里面的东西就跟父进程不一样了。
父进程则通常会调用wait()或者waitpid()等待子进程退出,做一些回收资源的工作。
如果在子进程结束之前,父进程结束了,子进程就会交由init进程托管。
在linux里用C语言编写创建进程、撤销进程,我是新手,求帮助,最好是有注释的简单易懂的。
谢谢
前面两人说的明显是线程的创建好不好?用 pid_t fork(void);创建一个子进程共享数据段和代码段,所以感觉上是会执行两次.可以在父进程中添加一个wait函数,以便于子进程先退出,再父进程退出.或者 pid_t vfork(void) 这也是创建一个进程,和前者区别不讲了.撤销进程的话,在程序里面可以自己从代码角度去退出,也可以在两个进程运行时,通过命令 ps来查看进程ID,,,在程序里面也可以获取进程的pid,ppid,可以直接在函数里面使用kill(),来终止进程.
linux怎样创建进程?
你是玩软件还是编程编程的话方法很多:调用fork,system等.
关于linux创建进程fork的问题
if( (PID=fork()) >0 ){\\\/\\\/处理语句}这就是处理的主要部分。
首先执行PID=fork(),返回给父进程的是子进程的ID,当然返回的子进程的是0。
然后判断PID>0,父进程跳过这个判断,子进程呢,就进入if里面执行。
这不就分开了嘛,呵呵.



