Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么使用字节数大于字符串中字节数的write(2)会使子进程保持打开状态?_C_Linux - Fatal编程技术网

C 为什么使用字节数大于字符串中字节数的write(2)会使子进程保持打开状态?

C 为什么使用字节数大于字符串中字节数的write(2)会使子进程保持打开状态?,c,linux,C,Linux,我必须为我的OS类实现一个shell。我使用write(2)和一些字符串,比如说“write this”,来编写STDOUT,并编写了比我想要编写的字符串更大的字节长度,比如说20。我读了手册页,在我看来,使用更大的数字就可以了 然后我分叉,在父对象中等待,在子对象中对一些输入使用execve(2)。无论成功或失败,这都应该退出子级,但为了以防万一,我在它后面放了一个exit()命令 父级在分叉之前设置了一个警报,如果执行过程花费的时间太长,则使用SIGINT杀死子级 这是一个循环 我发现我的孩

我必须为我的OS类实现一个shell。我使用write(2)和一些字符串,比如说“write this”,来编写STDOUT,并编写了比我想要编写的字符串更大的字节长度,比如说20。我读了手册页,在我看来,使用更大的数字就可以了

然后我分叉,在父对象中等待,在子对象中对一些输入使用execve(2)。无论成功或失败,这都应该退出子级,但为了以防万一,我在它后面放了一个exit()命令

父级在分叉之前设置了一个警报,如果执行过程花费的时间太长,则使用SIGINT杀死子级

这是一个循环

我发现我的孩子在某种程度上通过打印调试保持开放,并进入循环的顶端。当我修复了写入(2)以便使用输出字符串的正确字节数时,我发现问题已经解决。为了澄清我的警报、分叉、执行和其他一切工作正常,导致孩子们保持打开状态的唯一原因是写入的字节计数参数不正确(2)


是什么导致了这种行为?我无法在write(2)手册页或其他页面中找到除了可能与父级共享文件描述符的子级之外的任何指示,但我不确定这是否相关。

使用比字符串中实际可用长度更长的长度是不好的。这意味着您将尝试读取实际上不存在的字节,这是未定义的行为。理论上,这意味着任何事情都可能发生;实际上,我不知道为什么那件事会发生。一般来说,在循环外测试部分代码之前插入循环是个坏主意,以防出现问题。请注意,
execve()
用另一个程序(通常是不同的程序)替换当前运行的进程;它不会终止进程。如果您不显示代码,我们将无法提供太多帮助。您的描述并不清楚,但与代码相比并不精确,而且有很多方法会出错,虽然描述不会揭示,但代码会。请阅读有关创建MCVE()的内容,然后将其添加到问题中。