2016-02-19 88 views
0

我想通过做一些练习来学习在UNIX上编写C程序,但是我被困在这一块上。在本练习中,我需要父进程等待子进程执行某些操作的准确时间,然后父进程应该通过给出子进程的ID来终止它。这是我的代码。等待子进程的定义时间

int main() 
{ 
    int pid; 
    pid = fork(); 
    if (pid < 0) 
    { 
     printf("\n Error "); 
     exit(1); 
    } 
    else if (pid == 0) 
    { 
     printf("\n Id of child is %d ",getpid()); 
    } 
    else 
    { 
     sleep 3; 
     kill(0); 
     exit(1); 
    } 
} 

问题如下。我不确定睡眠3是否意味着父母等待3秒钟进行儿童进程。我想到了这样的一种方法,但似乎等待子进程终止。

int Time;  
waitpid(childPid, &Time, 0); 

if (Time == 0) 
{ 
    printf("Correct"); 
} 

if (Time == 1)  
{ 
    printf("Error");  
} 

第二个问题可能更简单,但我找不到哪个功能可以实现这一点。一个孩子进程(或父母,无关紧要)如何执行内置程序?

+0

http://pubs.opengroup.org/onlinepubs/007908775/xsh/sleep.html它以毫秒为单位。 – stackptr

+0

'杀(0);'不会做你认为它的事。您可能还想启用编译器警告。 – EOF

+0

@stackptr:什么是毫秒?你给出的链接的概要是'unsigned int sleep(unsigned int seconds);' - 这看起来像我期望的秒数。 AFAIK,在POSIX中没有,也从来没有一个毫秒级的睡眠机制。有经典的整秒“sleep()”;微秒usleep()'(现在不推荐使用,如果不是从当前的POSIX中丢失的话)。还有现代纳秒级的nanosleep()'。 –

回答

0

所以我很困惑,你到底想要做什么?要回答您的问题,要执行内置功能,您可以使用system()(也可以使用exec()系列功能)(检查http://linux.die.net/man/3/system)。使用wait()waitpid()将等待(阻止)孩子终止,如果您想要向父母指示某些内容,则可以在孩子中使用signal()(如类似于SIGCHLD的内容),以便父代终止它。您也可以使用alarm()让孩子在指定的时间后终止。

+0

您引用的帖子关注的是'execvp()'失败后''exit()'的一个相当特殊的问题。我看不出这篇文章。 – EOF

+0

对不起,我只是做了一些进一步的研究,发现我错了,可以从子进程中退出()。我只是觉得我在一些资料中读到,孩子应该使用'_exit()'。 – RastaJedi

+0

现在看来这不是什么大问题。也许短语是作为一个评论呢? – EOF