We use semaphore to ensure mutual exclusion to the standard error. If the process is using standard error, the other process must wait until the semaphore is released.
Copy gcc process-1.c -pthread -o process-1
gcc process-2.c -pthread -o process-2
./process-1 & ./process-2 &
Copy /*process-1.c*/
#include <fcntl.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int main ( int argc , char * argv [] ) {
sem_t * mutex;
char * c = "This is CSCI3150--An operating system course.\n" ;
// specify no buffering for stderr
setbuf(stderr , NULL ) ;
mutex = sem_open( "mutex_for_stderr" , O_CREAT , 0 666 , 1 ) ;
sem_wait(mutex) ;
while ( * c != '\0' ) {
fputc( * c , stderr) ;
c ++ ;
sleep( 1 ) ;
}
sem_post(mutex) ;
sem_close(mutex) ;
sem_unlink( "mutex_for_stderr" ) ;
return 0 ;
}
Copy /*process-2.c*/
#include <fcntl.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int main ( int argc , char * argv [] ) {
sem_t * mutex;
char * c = "This is CSCI3150--An operating system course.\n" ;
// specify no buffering for stderr
setbuf(stderr , NULL ) ;
mutex = sem_open( "mutex_for_stderr" , O_CREAT , 0 666 , 1 ) ;
sem_wait(mutex) ;
while ( * c != '\0' ) {
fputc( * c , stderr) ;
c ++ ;
sleep(rand() % 2 + 1 ) ;
}
sem_post(mutex) ;
sem_close(mutex) ;
sem_unlink( "mutex_for_stderr" ) ;
return 0 ;
}