假设fork()
调用成功,两个 进程都会写入两条 消息。
正如其他人指出的那样,您还存在字符串越界的问题。因此,它们首先写入"来自子进程的消息!\nMessage From"
,这是子进程的消息加上部分父进程的消息。然后它们继续写入"Message From parent!\n\0main\0\0\x01"
。其中的"main"可能是来自函数符号表的内容,也可能是调试信息的一部分。
如果您在多核CPU机器上运行这段代码,消息可能会交错出现,可能先是两次子进程的消息,再是两次父进程的消息。
建议采用类似以下的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
int writestring(int fd, const char *s)
{
return write(fd, s, strlen(s));
}
int main(int argc, char *argv[])
{
int fd = open("SomeFile.txt", O_WRONLY | O_CREAT | O_APPEND);
assert(fd > -1);
// 创建子进程
int fChild = fork();
if(fChild < 0) {
fprintf(stderr, "fork调用失败!\n");
// exit(1);
} else if (fChild == 0) {
sleep(7);
int childNumb = writestring(fd, "来自子进程的消息!\n");
} else {
int sec = writestring(fd, "来自父进程的消息!\n");
}
close(fd);
}
您可能也希望在主进程中添加一个wait()
调用来等待子进程结束。
此外,您也可以考虑open()
函数中的模式参数。以当前代码为例,每次重新运行程序时,它会在文件中追加两条新的消息。