gpt4 book ai didi

c - 让父进程等待并根据需要多次运行 linux 命令

转载 作者:行者123 更新时间:2023-11-30 20:32:23 25 4
gpt4 key购买 nike

我在 linux 中有以下 C 代码(使用 gcc):

void doWho(void)
{
char entry[10];
int ret, i;
ret = read(0, entry, 10);
if (*entry == 'u')
{
for(i=0; i<3; i++)
{
execl("/usr/bin/who","who",NULL);
}
}
}

int main(int argc, char *argv[])
{
int childpid;

printf("Before it forks\n");
childpid = fork();

if(childpid == 0)
{
printf("This is a child process\n");
doWho();
exit(0);
} else
{
printf("This is the parent process\n");
wait(NULL);
}

return 0;
}

我希望父进程无限期地等待,并在每次按“u”键时运行“who”。我只得到一次想要的效果,然后子进程和父进程退出。有什么帮助吗?

最佳答案

观察下面的循环:

for(i=0; i<3; i++)
{
execl("/usr/bin/who","who",NULL);
}

无论您旋转循环多少次,它都只会执行一次,因为当子进程开始运行时(PCB创建),您正在调用函数 doWho 然后控制权将转到 doWho 函数,并且在 doWho 函数中您在做什么? execl()execl() 的作用是“用 new 进程替换当前进程(child),当 i = 0 整个 子进程镜像 被使用 execl()new 替换,因此没有任何剩余子进程,这就是它只执行一次的原因。

如果你想执行尽可能多的进程,你应该在函数中使用fork(),因为exec将替换由fork()创建的每个进程,但不建议在循环中运行 fork(),因为当没有更多可用资源时,程序可能会崩溃。

因此将您的 doWho 函数替换为

void doWho(void)
{
char entry[10] = {0};
int ret, i;

for(; ;) {
/** who command will be executed when ever condition is true **/
ret = read(0, entry, 10);
__fpurge(stdin);//to clear stdin buffer everytime
if (*entry == 'u') {

if(fork()==0)//only this newly created process will be replaces by execl not one was in main()
execl("/usr/bin/who","who",NULL);
else
;// this parents does nothing
}
}
}

希望对您有所帮助。

关于c - 让父进程等待并根据需要多次运行 linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47694250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com