我的主要程序是创建多个孩子,每个孩子都写入stdout。为了避免它们互相写,我正在使用sprintf写组合,如下所示:
sprintf(buf, "Bubble Sort Process Started\n");
write(0, &buf, strlen(buf));
当我尝试打印出一个int数组时,我遇到了一个问题。每次程序运行时,数组的大小都会改变,所以我不能让一套sprintf一次打印所有内容。我可以考虑打印它的另一种方法是使用循环遍历数组,但是其他进程可以让它们的输出显示出来。如何在不让另一个进程同时打印其输出的情况下打印整个数组?
答案 0 :(得分:0)
假设您正在使用POSIX系统(就像您可能的那样,根据您的假设存在write
系统调用),您应该能够在开始写入调用之前设置锁定到filedescriptor 1 ,并在完成write
批次后解锁。
以下是一个演示它的简单程序:
#include <unistd.h>
#include <fcntl.h>
void print(char C)
{
for(;;){
#if LOCK
fcntl(1, F_SETLKW, &(struct flock){ F_WRLCK, SEEK_SET, 0, 1 });
#endif
for(int i=0; i<100; i++)
write(1, &C, 1);
write(1, "\n", 1);
#if LOCK
fcntl(1, F_SETLKW, &(struct flock){ F_UNLCK, SEEK_SET, 0, 1 });
#endif
}
}
int main()
{
for(int i=0; i<4; i++) /*4 children*/
if(0==fork())
print('a'+i);
pause(); /*terminate it with Ctrl+C*/
}
这个程序将创建4个孩子,每个孩子都试图打印一系列无限的行,每行包含100个字符C(第一个孩子为'a',第二个孩子为'b',等等)。由于写入一次是1个字节,因此这些行将交织在一起。用-DLOCK = 1编译,每个输出的行都不会中断。