在我的程序中,我在main函数fork中使用来创建2个进程。子进程执行某些操作,父进程再次分叉,他的子进程调用另一个函数。两个函数都写入1个文件,一切正常。
我需要的是在函数和所有进程(两个函数都创建进程)完成之后,在文件末尾写一些东西。
我试图在main中的每个地方编写fprintf命令,它总是写在文件中间的某个地方,所以我认为main可以与2个函数并行运行。
我试着用信号量
s = sem_open(s1, o_CREATE, 0666, 0);
通过这种方式:在每个函数的最后我写了sem_post(s)
,在main中我放了sem_wait(s); sem_wait(s);
,之后我写了fprintf命令,但它也没有用。
有什么方法可以解决这个问题吗?
感谢
答案 0 :(得分:1)
我认为您正在寻找wait
功能。请参阅this stack overflow question:wait(NULL)
将等待所有孩子完成等待子进程完成(感谢Jonathan Leffler)。在循环中调用wait
以等待所有子进程完成。只需在写入父进程中的文件之前使用该函数。
如果您想等待特定进程而不是所有进程,也可以阅读waitpid
函数。
编辑:
或者,您实际上可以跨进程使用信号量,但它需要更多的工作。见this stack overflow answer。基本思想是使用函数sem_open
和O_CREAT
常量。 sem_open
有2个功能签名:
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
If O_CREAT is specified in oflag, then two additional arguments must be supplied. The mode argument specifies the permissions to be placed on the new semaphore, as for open(2). (Symbolic definitions for the permissions bits can be obtained by including <sys/stat.h>.) The permissions settings are masked against the process umask. Both read and write permission should be granted to each class of user that will access the semaphore. The value argument specifies the initial value for the new semaphore. If O_CREAT is specified, and a semaphore with the given name already exists, then mode and value are ignored.
在您的父进程中,使用mode和value参数调用sem_open
,为其提供所需的权限。在子进程中,调用sem_open("YOUR_SEMAPHORE_NAME", 0)
打开该信号量以供使用。