Linux c学习--进程基础学习
2012-06-02 16:04 Rollen Holt 阅读(948) 评论(0) 编辑 收藏 举报#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char const *argv[]) { printf("I am process %ld\n", (long)getpid() ); printf("My parent is %ld\n", (long)getppid()); return 0; }
上面的例子输出了进程的ID和他的父进程的ID
#include <unistd.h> #include <stdio.h> int main(int argc, char const *argv[]) { printf("my real user id is %ld\n", (long)getuid()); printf("my effective user id is %ld\n",(long)geteuid()); printf("My real group id is %ld\n", (long)getgid()); printf("My effective group id is %ld\n",(long)getegid() ); return 0; } /* this program run's result as follows : my real user id is 1000 my effective user id is 1000 My real group id is 1000 My effective group id is 1000 */
上面的这个程序打印进程的各种ID和组ID
#include <unistd.h> #include <stdio.h> int main(int argc, char const *argv[]) { int x; x=0; fork(); printf("I am process %ld and my x is %d\n", (long)getpid() ,x); return 0; } /* this program run's result as follows: I am process 5416 and my x is 0 I am process 5417 and my x is 0 */
简单的fork的例子
#include <unistd.h> #include <stdio.h> int main(int argc, char const *argv[]) { pid_t childpid; childpid=fork(); if(childpid== -1){ perror("Failed to fork\n"); return 1; } if(childpid==0){ printf("I am child %ld\n", (long)getpid()); }else{ printf("I am parent %ld\n",(long)getpid() ); } return 0; } /* this program run's result as follows: I am parent 5467 I am child 5468 */
上面的例子输出了执行fork之后,父进程和子进程分别输出自身的ID
#include <unistd.h> #include <stdio.h> int main(int argc, char const *argv[]) { pid_t mypid; pid_t childpid; mypid=getpid(); childpid=fork(); if(childpid==-1){ perror("Failed to frok\n"); return 1; } if(childpid==0){ // child codes printf("I am child %ld, ID= %ld\n",(long)getpid(),(long)mypid); }else{ // parent codes printf("I am parent %ld, ID=%ld\n",(long)getpid(),(long)mypid ); } return 0; } /* this program run's result as follows: I am parent 5517, ID=5517 I am child 5518, ID= 5517 */
父进程在调用fork之前,将mypid设置为自己的进程ID,执行fork之后,子进程获得了包含所有变量在内的父进程的地址空间的一份拷贝,由于子进程没有重置mypid,所以打印出的指不一样。
#include <stdio.h> #include <unistd.h> int main(int argc, char const *argv[]) { pid_t childpid=0; int i,n; /*check for vaild number of common-line arguments*/ if(argc!=2){ fprintf(stderr, "usage: %s process \n", argv[0] ); return 1; } n=atoi(argv[1]); for ( i = 0; i < n; ++i) { if(childpid=fork()){ break; } fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n", i, (long)getpid(),(long)getppid(),(long)childpid); } return 0; } /* this program run's result as follows: i:0 process ID: 5603 parent ID: 1 child ID: 0 i:1 process ID: 5604 parent ID: 1 child ID: 0 i:2 process ID: 5605 parent ID: 1 child ID: 0 i:3 process ID: 5606 parent ID: 1 child ID: 0 */
上面的程序简单的创建了一个进程链。1->2->3->4...,另外大家要注意我在这里使用的是stderr,而不是stdout,因为系统会对写入stdout的进行缓冲。这样,特定的消息不能在printf之后立即显示。写入stderr则不会进行缓冲,而是立即写出。
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char const *argv[]) { pid_t childpid=0; int i,n; if (argc!=2) { fprintf(stderr, "usage: %s processes\n",argv[0] ); return 1; } n=atoi(argv[1]); for ( i = 0; i < n; ++i) { if((childpid=fork())<=0){ break; } fprintf(stderr, "i:%d process ID:%ld, parent ID: %ld, child ID: %ld\n", i,(long)getpid(),(long)getppid(),(long)childpid ); } return 0; }
上面的例子简单的创建了一个进程扇。
#include <stdio.h> #include <unistd.h> #include <stdlib.h> // this program will print some information after all the child process exits; pid_t r_wait(int* stat_lco); int main(int argc, char const *argv[]) { pid_t childpid=0; int i,n; if (argc!=2) { fprintf(stderr, "usage: %s processes\n",argv[0] ); return 1; } n=atoi(argv[1]); for ( i = 0; i < n; ++i) { if((childpid=fork())<=0){ break; } while(r_wait(NULL)>0); /*wait for all of your children*/ fprintf(stderr, "i:%d process ID:%ld, parent ID: %ld, child ID: %ld\n", i,(long)getpid(),(long)getppid(),(long)childpid ); } return 0; } pid_t r_wait(int* stat_lco){ int retval; while(((retval=wait(stat_lco)==-1)&& (errno==EINTR)); return retval; }
上面的进程扇使得所有子进程都推出之后,打印消息。
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> // can you discribe all of this program run's results int main(int argc, char const *argv[]) { pid_t childpid; // set up signal handlers here childpid=fork(); if(childpid==-1){ perror("Faild to fork\n"); return 1; } if(childpid==0){ fprintf(stderr, "I am child %ld\n",(long)getpid() ); }else if(wait(NULL)!=childpid){ fprintf(stderr, "A signal must have interrupted the wait\n"); }else{ fprintf(stderr, "I am parent %ld with child %ld\n", (long)getpid(),(long)childpid); } return 0; }
你能描述一下上面例子的所有可能输出吗?
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <errno.h> int main(int argc, char const *argv[]) { pid_t childpid=0; int i,n; if(argc!=2){ fprintf(stderr, "Usage: %s processes\n", argv[0] ); return 1; } n=atoi(argv[1]); for (i = 0; i < n; ++i) { if((childpid=fork())<=0){ break; } for(;;){ childpid=wait(NULL); if((childpid== -1)&&(errno != EINTR)){ break; } } } fprintf(stderr, "I am process %ld, my parent is %ld\n",(long)getpid(),(long)getppid() ); return 0; }
上面的例子创建了一个进程扇,所有被创建的进程都是原始进程的子进程。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main(int argc, char const *argv[]) { pid_t childpid; childpid=fork(); if(childpid== -1){ perror("Failed to fork\n"); return 1; } /*child code*/ if(childpid==0){ execl("/bin/ls","ls","-l",NULL); perror("child Failed to execl ls\n"); return 1; } /*parent code*/ if(childpid!=wait(NULL)){ perror("parent Failed to wait due to signal or error\n"); return 1; } return 0; }
创建子进程来执行: ls -l命令。
==============================================================================
本博客已经废弃,不在维护。新博客地址:http://wenchao.ren
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================