【发布时间】:2018-04-13 22:13:04
【问题描述】:
我正在实施一个命令行解释器作为大学作业。我得到命令字符串,然后我必须在子进程中分叉并执行命令。这是我的代码示例:
do
{
if (argc == 1)
{
do
{
do
{
printf("prompt>> ");
line = get_string();
}while(strcmp(line, "") == 0 || line[0] == ';');
if ( (pid = fork()) < 0 )
{
perror("error in forking.");
exit(1);
}
else if (pid == 0)
{
// execute the commands with format: cmd1 ; cmd2 ; cmd3
line_1 = strtok(line, NULL);
if ( strcmp(line_1, "quit")
{
flag = 1;
}
}
else
{
printf("...mother proccess...\n");
}
while ( (wpid = wait(&stat)) > 0)
}while(status);
}
}while(something);
如果我有一个quit 命令格式为cmd1 ; cmd2; cmd3 的命令,我必须执行所有命令然后退出程序,而与quit 命令在命令格式中的位置无关。如果我发现退出,我已设法执行所有命令并将 flag 变量设置为 1。问题是如果在所有命令执行完成后flag == 1 我无法退出我的程序。我尝试通过使用父母的 id 从孩子发送SIGTERM 信号,但 id 不起作用。我怎么能这样做?
【问题讨论】:
-
让母进程解析命令,然后才fork
-
通常你通过调用
exit来退出你的程序。你试过吗?你确定flag已经设置了吗?if ( strcmp(line, "quit")的格式似乎不正确,可能无法执行您认为应该执行的操作。请不要在发布问题时输入您的代码。而是从实际的可构建代码中复制和粘贴。 -
我在
if-clase中放置了一个printf语句来检查quit并检查它是否在放置quit命令时得到它。我的实际代码行数太多,这就是我试图缩小它的原因。 -
缩小代码是可以的,但不能在进程中破坏它。请生成minimal reproducible example。
-
你不想
strcmp(line_1 ...吗?或strstr(line, "quit")?