1.fork.c
#include <string.h>
#include <stdio.h>
#include <errno.h>
int main(int argc,char*argv[])
{
int pid;
char *prog_argv[4];
prog_argv[0]="/bin/ls";
prog_argv[1]="-l";
prog_argv[2]="/";
prog_argv[3]=NULL;
if ((pid=fork())<0)
{
perror("Fork failed");
exit(errno);
}
if (!pid)
{
execvp(prog_argv[0],prog_argv);
}
if (pid)
{
waitpid(pid,NULL,0);
}
}
2.pipe.c
#include <string.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int status;
int pid[2];
int pipe_fd[2];
char *prog1_argv[4];
char *prog2_argv[2];
prog1_argv[0]="/bin/ls";
prog1_argv[1]="-l";
prog1_argv[2]="/etc/";
prog1_argv[3]=NULL;
prog2_argv[0]="/bin/more";
prog2_argv[1]=NULL;
if (pipe(pipe_fd)<0)
{
perror("pipe failed");
exit(errno);
}
if ((pid[0]=fork())<0)
{
perror("Fork failed");
exit(errno);
}
if (!pid[0])
{
close(pipe_fd[0]);
dup2(pipe_fd[1],1);
close(pipe_fd[1]);
execvp(prog1_argv[0], prog1_argv);
}
if (pid[0])
{
if ((pid[1]=fork())<0)
{
perror("Fork failed");
exit(errno);
}
if (!pid[1])
{
close(pipe_fd[1]);
dup2(pipe_fd[0],0);
close(pipe_fd[0]);
execvp(prog2_argv[0],prog2_argv);
}
close(pipe_fd[0]);
close(pipe_fd[1]);
waitpid(pid[1],&status,0);
printf("Done waiting for more.\n");
}
}
3.process
#include <stdio.h>
#include <signal.h>
#include <stddef.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/termios.h>
int main()
{
int cpid;
int ppid;
char buf[256];
ppid=getpid();
cpid=fork();
if (cpid<0)
exit(-1);
if (!cpid)
{
printf("ID(child)=%d\n",getpid());
setpgid(0,0);
tcsetpgrp(0,getpid());
execl("/bin/vi","vi",NULL);
exit(-1);
}
printf("ID(parent)=%d\n",ppid);
setpgid(cpid,cpid);
tcsetpgrp(0,cpid);
waitpid(cpid,NULL,0);
tcsetpgrp(0,ppid);
while(1)
{
memset(buf, 0, 256);
fgets(buf, 256, stdin);
puts("ECHO: ");
puts(buf);
puts("\n");
}
}
4.signal
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stddef.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/termios.h>
void ChildHandler (int sig, siginfo_t* sip, void* notused)
{
int status;
printf("The process generating the signal is PID: %d\n",sip->si_pid);
fflush(stdout);
status=0;
if(sip->si_pid==waitpid(sip->si_pid, &status, WNOHANG))
{
if(WIFEXITED(status)||WTERMSIG(status))
printf("The child is gone!!!!!\n");
else
printf("Uninteresting\n");
}
else
{
printf("Uninteresting\n");
}
};
int main()
{
struct sigaction action;
action.sa_sigaction=ChildHandler;
sigfillset(&action.sa_mask);
action.sa_flags = SA_SIGINFO;
sigaction(SIGCHLD,&action,NULL);
int pid;
pid = fork();
while(1)
{
if (pid)
printf("PID(parent): %d\n",getpid());
else
printf("PID(child): %d\n",getpid());
sleep(1);
}
return 0;
}