使用写入系统调用不间断打印Int数组

时间:2017-09-29 14:25:41

标签: c arrays system-calls

我的主要程序是创建多个孩子,每个孩子都写入stdout。为了避免它们互相写,我正在使用sprintf写组合,如下所示:

sprintf(buf, "Bubble Sort Process Started\n");
write(0, &buf, strlen(buf)); 

当我尝试打印出一个int数组时,我遇到了一个问题。每次程序运行时,数组的大小都会改变,所以我不能让一套sprintf一次打印所有内容。我可以考虑打印它的另一种方法是使用循环遍历数组,但是其他进程可以让它们的输出显示出来。如何在不让另一个进程同时打印其输出的情况下打印整个数组?

1 个答案:

答案 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编译,每个输出的行都不会中断。