gpt4 book ai didi

c - 在 C 语言中,我们是否可以在不使用 busywaiting 的情况下从管道中读取数据,可能是使用回调或其他方式?

转载 作者:太空狗 更新时间:2023-10-29 16:48:55 24 4
gpt4 key购买 nike

我试图从一个 fork 进程的 STDOUT 中读取。但是,如果我在无限的 for 循环 中从管道读取数据,即使没有数据通过管道,它也会忙于等待(如果我错了请纠正我),我猜必须是比使用 sleep 更好的方法,如果它是短时间间隔,可能是回调,我不确定。以下是我尝试过的代码片段。

pid_t pid = fork();  
switch (pid) {
case 0:
dup2 (pipes[1], STDOUT_FILENO );
dup2(pipes[1], STDERR_FILENO);
close(pipes[0]);
close(pipes[1]);
execv(path, args);
break;
default :
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
child_pid = pid;
signal(SIGHUP, mysighandle);
close(pipes[1]);
ssize_t nbytes;
for (;;) {
nbytes = read(pipes[0], buf, BUFSIZE);
if (nbytes == -1){
break;
}
if (nbytes == 0) {
break;
}
syslog(LOG_NOTICE, "%s", buf);

有人可以提出一个没有忙等待的更好方法,可以用来从管道读取数据吗?由于我是 C 的初学者,因此非常感谢任何对代码片段的引用。

问候。

最佳答案

在您的代码中,您没有将管道设置为 non-blocking mode (至少,我假设你没有,因为你实际上没有展示你是如何打开它的),所以read()正在进行阻塞读取。也就是说,如果没有可用数据,但某些进程仍然打开管道进行写入,那么它会自动暂停您的进程,直到有更多数据可用(然后将该数据读入缓冲区)。

因此,您的代码可以正常工作,无需更改。

(也就是说,除非你想同时从多个管道读取数据,或者在等待数据的同时也在同一个线程中做其他事情,在这种情况下你确实应该使用 select() 并且(可能)非阻塞 I/O。)

关于c - 在 C 语言中,我们是否可以在不使用 busywaiting 的情况下从管道中读取数据,可能是使用回调或其他方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40219057/

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