user6529061
user6529061

Reputation: 13

Real parallelism in Linux shell

I am trying to have real parallelism on Linux shell, but I can't achieve it.

I have two programs. Allones, that only prints '1' character, and allzeros, that only prints 0 characters.

When I execute "./allones & ./allzeros &", I get big prints of '0's, and big prints of '1's, that mix in big chunks (e.g. 1111....111000...0000111...111000...000"). My processor has 8 cores.

However, when I executed my own program on a multi-core FPGA (with no OS), (If I distribute programs on different cores) I get something like "011000101000011010...".

How can I run it on Linux to get a result similar to what I get on a multi-core FPGA?

Upvotes: 1

Views: 88

Answers (1)

that other guy
that other guy

Reputation: 123610

Sounds like you're experiencing libc's default line buffering:

Here's a test program spam.c:

#include <stdio.h>    
int main(int argc, char** argv) {
  while(1) {
    printf("%s", argv[1]);
  }
}

We can run it with:

$ ./spam 0 & ./spam 1 & sleep 1; killall spam

11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111(...)000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(...)

On my systems, each block is exactly 1024 bytes long, strongly hinting at a buffering issue.

Here's the same code with a fflush to prevent buffering:

#include <stdio.h>    
int main(int argc, char** argv) {
  while(1) {
    printf("%s", argv[1]);
    fflush(stdout);
  }
}

This is the new output:

100111001100110011001100110011001100110011100111001110011011001100110011001100110011001100110011001100110011001100110011001100011000110001100110001100100110011001100111001101100110011001100110011001100110000000000110010011000110011

Upvotes: 2

Related Questions