我在Linux下有一个长期运行的程序:
longrun.c
#include <stdio.h>
int main()
{
int mode=0;
int c=0;
while(1)
{
printf("\nrun @ mode %d value : %d ",mode,c );
if (c>100)
c=0;
if(mode==0)
c++;
else
c=c+2;
sleep(3);
}
return 0;
}
将显示
run @ mode 0 value : 0
run @ mode 0 value : 1
run @ mode 0 value : 2
我需要在C中编写另一个程序(像changemode.c
这样的东西),以便它可以与longrun.c
进行通信
并将mode的值设置为其他值,以便正在运行的程序
以递增顺序显示值。
即,如果我在几分钟后运行程序,它将以这种模式显示:
run @ mode 0 value : nnn
run @ mode 0 value : nnn+2
run @ mode 0 value : (nnn+2)+2
我可以使用file方法,changemode.c将创建一个说模式= 2的文件 然后longrun.c将每次打开并检查并继续。还有其他更好的解决方法,比如进程间通信吗?
如果可能,任何人都可以写一个changemode.c的样本吗?
答案 0 :(得分:0)
Unix编程中最基本的一个想法是进程分叉,以及在两个进程之间建立管道。 longrun
可以首先创建pipe,调用fork,然后使用父进程作为changemode
'监控'进程,并使用子进程{{1现在。您需要在两端定期读/写。
答案 1 :(得分:0)
正如其他答案所述,您需要某种进程间通信。您可以在“Beej指南Unix IPC”(它是“经典”)中找到有关该主题的更多信息,可从以下网址获取:
费尔南多
答案 2 :(得分:0)
解决方案分为两部分:
两个进程之间的通信通道。 Unix域套接字是一个很好的工具,它们的行为类似于TCP / IP套接字。
用sleep
替换select
。 select
将侦听套接字,处理与其他程序的通信。您还可以指定3秒超时,因此当它返回0(表示套接字上没有活动)时,您知道是时候打印一些输出。
作为#2的替代方案,您可以使用两个线程 - 一个休眠并生成输出,另一个处理套接字。请注意,线程共享的任何数据都应该是同步的(在非常简单的情况下,只有一个整数,你可能什么都不需要,但是当它变得更复杂时你肯定会这样做。)