/* winmutex.c a program using WIN32 mutexes */
#include <windows.h>
#include <stdio.h>

void CriticalSection(int num)
{
	printf("Thread %d is in its critical section\n",num);
	Sleep((rand()%4) * 1000); 
	printf("Thread %d is leaving its critical section\n",num);
}

void NonCriticalSection(int num)
{
	printf("Thread %d is in its noncritical section\n",num);
	Sleep((rand()%4) * 1000);
	printf("Thread %d is leaving its noncritical section\n",num);
}

DWORD WINAPI ThreadController(LPVOID lpParameter)
{
	int *num = (int *)malloc(sizeof(int));
	int i;
	HANDLE hMutex;

	*num = *(int *)lpParameter;
	hMutex = CreateMutex(NULL,FALSE,"Hello");
	if (hMutex==INVALID_HANDLE_VALUE) {
		printf("Error,could not create the mutex\n");
		return 0;
	}
	for (i=0;i < 4;i++) {
		NonCriticalSection(*num);
        WaitForSingleObject(hMutex,INFINITE);
		CriticalSection(*num);
		ReleaseMutex(hMutex);
	}
	return 0;
}

int main()
{
	int i;
	int *arg;
	HANDLE TheHandles[5];
	DWORD ThreadId;
	for (i=0;i<5;i++) {
		arg = (int *)malloc(sizeof(int));
		*arg = i;
	    TheHandles[i] = CreateThread(NULL,0,ThreadController,arg,0,&ThreadId);
		if (TheHandles[i] == INVALID_HANDLE_VALUE) {
			printf("Error creating the thread %d\n",i);
		}
	}

	for (i=0;i<5;i++)
		WaitForSingleObject(TheHandles[i],INFINITE);
	return 0;
}




/* pipe.c */
#include <unistd.h>
#include <stdio.h>

int main()
{
  pid_t pid;
  int retval, fd[2], n;

  retval = pipe(fd);
  if (retval < 0) {
    printf("Pipe failed\n"); /* unlikely */
    exit(0);
  }

  pid = fork();
  if (pid == 0) { /* child */
    close(fd[0]);
    n = write (fd[1],
             "Hello from the child",20);
    exit(0);
  }
  else if (pid > 0) { /* parent */
    char buffer[64];
    close(fd[1]);
    n = read(fd[0],buffer,64);
    buffer[n]='\0';
    printf("I got your message: %s\n",buffer);
  }
  return 0;
}






/* pipeexec.c */
#include <stdio.h>
#include <unistd.h>

void error(char *msg)
{
     perror(msg);
     exit(1);
}

int main()
{
    int p[2], retval;
    retval = pipe(p);
    if (retval < 0) error("pipe");
    retval=fork();
    if (retval < 0) error("forking");
    if (retval==0) { /* child */
       dup2(p[1],1); /* redirect stdout to pipe */
       close(p[0]);  /* don't permit this 
             process to read from pipe */
       execl("/bin/ls","ls","-l",NULL);
       error("Exec of ls");
    }
    /* if we get here, we are the parent */ 
     dup2(p[0],0); /*redirect stdin to pipe*/
     close(p[1]);  /* don't permit this 
                  process to write to pipe */
     execl("/bin/more","more",NULL);
     error("Exec of more");
     return 0;
}
