Unix系统编程

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进程终止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值