c中的非阻塞输入

时间:2013-02-26 07:29:33

标签: c++ c fork

我想实现一个功能,使循环继续迭代,同时从用户获取输入(如果可用)。 我已经实现了以下代码,但扫描变量“a”的值在打印时没有反映出来。

pid_t pid;
pid=fork();
if(pid == 0 )
{
    while(1)
    {
        printf("%d\n",a);
        sleep(1);
    }
}
else
{
    while(1)
    {
        scanf("%d",&a);
    }
}

5 个答案:

答案 0 :(得分:3)

那是因为你有两个使用fork()的独立进程。如果你想要遵循这种方法,你将需要使用线程。

答案 1 :(得分:2)

当你创建fork()时,子进程将使用程序的共享文本区域创建,但是创建的子进程的数据和堆栈部分与父进程不同,因此child将始终打印a = 1。

答案 2 :(得分:0)

在这种情况下,您将获得两个不同的流程,每个流程都有自己的a

您应该使用Linux pipes

答案 3 :(得分:0)

如果使用fcntl()将stdin标记为非阻塞然后在循环中执行您需要的操作并尝试读取它会更快,如果没有可用数据则会失败并将数据存储在缓冲区中如果它可用。这将使用100%的CPU。要检查数据是否可用,您应该使用select()。

答案 4 :(得分:0)

您也可以使用共享内存,但必须使用信号量同步对共享内存段的访问。