zoukankan      html  css  js  c++  java
  • Linux c学习进程基础学习

    #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命令。

  • 相关阅读:
    Mysql推荐使用规范
    程序员应该经常浏览的技术网站
    百度,腾讯,阿里等互联网公司年终奖发多少
    JNI技术详解,让程序有飞一般的感觉
    日志:分布式系统的核心
    Spring Boot七:Spring boot集成MyBatis
    通俗理解TCP的三次握手
    JDBC添加数据
    JDBC概念
    今天是阳光明媚的一天
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2532001.html
Copyright © 2011-2022 走看看