代码之家  ›  专栏  ›  技术社区  ›  Raviga

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

  •  1
  • Raviga  · 技术社区  · 7 年前

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

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

    当我试图打印一个int数组时,我遇到了一个问题。每次程序运行时,数组的大小都会发生变化,所以我不能用一组sprint同时打印所有内容。我能想到的唯一其他打印方法是使用循环在数组中迭代,但其他进程的输出可以部分通过。如何在不让另一个进程同时打印其输出的情况下打印整个阵列?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Petr Skocik    7 年前

    假设您在POSIX系统上(根据您的假设判断,您可能是在POSIX系统上) write 系统调用),您应该能够在开始写调用之前将锁设置为filedescriptor 1,并在完成写调用后将其解锁 一批

    下面是一个简单的程序来演示它:

    #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*/
    
    }