Unix系统编程

来源:互联网 发布:dom编程艺术第三版 编辑:程序博客网 时间:2024/05/16 01:24
fork系统调用:
pid_t fork(void);
一个成功的fork调用将促使内核创建一个新的进程,该进程是调用进程的一个精确副本。
pid = fork();
其中的pid可以用来区分父进程和子进程。在父进程中,pid被设置为一个非零的正整数,而在子进程中被设置为零。返回到父进程的pid值,称为子进程的进程id。
   
    pid_t pid;
    pid_t cid,did;
    
    printf(
"Just One process so far ");
    printf(
"Calling fork... ");
    pid 
= fork();
    
    
if(pid == 0){
        printf(
"I'm the child. ");
        cid 
= fork();
        
if(cid > 0)        printf("grandson1 id =  %d. ",cid);
        
if(cid == 0)    printf("I'm the grandson1 process ");
        
    }

    
else if(pid > 0{
        printf(
"I'm the parent ,child has pid %d ",pid);
         did 
= fork();
        
if(did > 0)        printf("grandson2 id =  %d. ",cid);
        
if(did == 0)    printf("I'm the grandson2 process ");
    }

    
    
else printf("Fork returned erro code,no child ");
这段程序创建两个子进程,每个子进程再创建一个它们自己的子进程。在每个fork之后,每个父进程打印其后代进程的进程id。

使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。
     printf("executing ls ");    
     execl(
"/bin/ls","ls","-1",(char*)0);
     perror(
"execl failed to run ls");
     exit(
1);

   本例中,在成功调用execl之后,调用进程被覆盖,所以就不执行perror,由此可知,当execl和相关调用返回时,它们通常返回-1。
将exec和fork一起使用:
   
pid_t pid;
    
switch(pid=fork()){
        
case -1:
            fatal(
"fork failed");
            
break;
        
case 0:
            execl(
"/bin/ls","ls","-1",(char*)0);
            fatal(
"exec failed");
            
break;
        
default:
            wait((
int*)0);
            printf(
"is completed ");
            
break;
        }
fork调用之后,父进程执行wait系统调用,导致A进程挂起直到B进程终止。