ostep: add hw5
This commit is contained in:
		
							parent
							
								
									72f3484804
								
							
						
					
					
						commit
						22f71e1c99
					
				| 
						 | 
				
			
			@ -1,4 +1,10 @@
 | 
			
		|||
TARGETS :=	hw5_1
 | 
			
		||||
TARGETS :=	hw5_1	\
 | 
			
		||||
		hw5_2	\
 | 
			
		||||
		hw5_3	\
 | 
			
		||||
		hw5_5	\
 | 
			
		||||
		hw5_6	\
 | 
			
		||||
		hw5_7	\
 | 
			
		||||
		hw5_8
 | 
			
		||||
 | 
			
		||||
all: $(TARGETS)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
const char	default_path[] = "hello.txt";
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	char	 buf[2] = {0x41, 0x0a};
 | 
			
		||||
	char	*pathname = (char *)default_path;
 | 
			
		||||
	int	 fd = -1;
 | 
			
		||||
 | 
			
		||||
	if (argc > 1) {
 | 
			
		||||
		pathname = argv[1];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fd = open(pathname, O_WRONLY|O_CREAT, S_IWUSR|S_IRUSR);
 | 
			
		||||
	if (fd == -1) {
 | 
			
		||||
		perror("open");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pid_t	pid = fork();
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
	else if (pid > 0) {
 | 
			
		||||
		for (int i = 0; i < 5; i++) {
 | 
			
		||||
			write(fd, buf, 2);
 | 
			
		||||
			sleep(1);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		buf[0] = 0x42;
 | 
			
		||||
		for (int i = 0; i < 5; i++) {
 | 
			
		||||
			write(fd, buf, 2);
 | 
			
		||||
			sleep(1);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	close(fd);
 | 
			
		||||
	exit(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	int	pipefd[2];
 | 
			
		||||
 | 
			
		||||
	if (pipe(pipefd) == -1) {
 | 
			
		||||
		perror("pipe");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pid_t	pid = fork();
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
	else if (pid > 0) {
 | 
			
		||||
		close(pipefd[1]);
 | 
			
		||||
 | 
			
		||||
		char	buf[1];
 | 
			
		||||
		read(pipefd[0], buf, 1);
 | 
			
		||||
		printf("goodbye\n");	
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		sleep(1);
 | 
			
		||||
		close(pipefd[0]);
 | 
			
		||||
 | 
			
		||||
		printf("hello\n");
 | 
			
		||||
		close(pipefd[1]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
#include <sys/types.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	int	status = 0;
 | 
			
		||||
 | 
			
		||||
	pid_t	pid = fork();
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		exit(EXIT_FAILURE);
 | 
			
		||||
	}
 | 
			
		||||
	else if (pid > 0) {
 | 
			
		||||
		wait(&status);
 | 
			
		||||
		if (!WIFEXITED(status)) {
 | 
			
		||||
			fprintf(stderr, "child exited due to an error\n");
 | 
			
		||||
		}
 | 
			
		||||
		printf("goodbye: %d\n", status);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		wait(&status);
 | 
			
		||||
		if (!WIFEXITED(status)) {
 | 
			
		||||
			fprintf(stderr, "child exited due to an error\n");
 | 
			
		||||
		}
 | 
			
		||||
		printf("hello: %d\n", status);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exit(EXIT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
#include <sys/types.h>
 | 
			
		||||
#include <sys/wait.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	int	status = 0;
 | 
			
		||||
 | 
			
		||||
	pid_t	pid = fork();
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		exit(EXIT_FAILURE);
 | 
			
		||||
	}
 | 
			
		||||
	else if (pid > 0) {
 | 
			
		||||
		waitpid(pid, &status, 0);
 | 
			
		||||
		if (!WIFEXITED(status)) {
 | 
			
		||||
			fprintf(stderr, "child exited due to an error\n");
 | 
			
		||||
		}
 | 
			
		||||
		printf("goodbye: %d\n", status);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		printf("hello: %d\n", status);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exit(EXIT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
#include <sys/wait.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	pid_t	pid;
 | 
			
		||||
 | 
			
		||||
	pid = fork();
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		exit(1);
 | 
			
		||||
	}
 | 
			
		||||
	// child
 | 
			
		||||
	else if (pid > 0) {
 | 
			
		||||
		close(STDOUT_FILENO);
 | 
			
		||||
		printf("screaming into the void...\n");
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		wait(NULL);
 | 
			
		||||
		printf("the darkness\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	exit(EXIT_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,85 @@
 | 
			
		|||
#include <sys/wait.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int	pipefd[2];
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(void)
 | 
			
		||||
{
 | 
			
		||||
	if (pipe(pipefd) != 0) {
 | 
			
		||||
		perror("pipe");
 | 
			
		||||
		return EXIT_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
	int	pwrite = pipefd[1];
 | 
			
		||||
	int	pread = pipefd[0];
 | 
			
		||||
 | 
			
		||||
	pid_t	pid = fork();
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		return EXIT_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
	/* the first child */
 | 
			
		||||
	else if (pid == 0) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * Close standard output and reassign it to the pipe.
 | 
			
		||||
		 * The close is done automagically by dup2.
 | 
			
		||||
		 */
 | 
			
		||||
		dup2(pwrite, STDOUT_FILENO);
 | 
			
		||||
 | 
			
		||||
		/* Close unnecessary pipe read file descriptor. */
 | 
			
		||||
		close(pread);
 | 
			
		||||
 | 
			
		||||
		/* Now we do the thing. */
 | 
			
		||||
		printf("Hello, world.\n");
 | 
			
		||||
 | 
			
		||||
		/* ¡Adios! */
 | 
			
		||||
		return EXIT_SUCCESS;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * We are now in the parent. We must fork again, and do the
 | 
			
		||||
	 * child dance.
 | 
			
		||||
	 */
 | 
			
		||||
	if ((pid = fork()) < 0) {
 | 
			
		||||
		perror("fork");
 | 
			
		||||
		return EXIT_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
	/* the second of the children */
 | 
			
		||||
	else if (pid == 0) {
 | 
			
		||||
		/* Close standard input and reassign it to the pipe. */
 | 
			
		||||
		dup2(pread, STDIN_FILENO);
 | 
			
		||||
 | 
			
		||||
		/* Close unnecessary pipe write file descriptor. */
 | 
			
		||||
		close(pwrite);
 | 
			
		||||
 | 
			
		||||
		/* Read the thing. */
 | 
			
		||||
		char	data[16];
 | 
			
		||||
		ssize_t	rl;
 | 
			
		||||
 | 
			
		||||
		memset(data, 0, 16);
 | 
			
		||||
		rl = read(STDIN_FILENO, data, 15);
 | 
			
		||||
		if (rl < 1) {
 | 
			
		||||
			perror("read");
 | 
			
		||||
			return EXIT_FAILURE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		printf("%s", data);
 | 
			
		||||
		return EXIT_SUCCESS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* wait for the children to die so we can reap them */
 | 
			
		||||
	/* there are two, they should drop dead on their own. */
 | 
			
		||||
	int status1, status2;
 | 
			
		||||
	waitpid(-1, &status1, 0);
 | 
			
		||||
	waitpid(-1, &status2, 0);
 | 
			
		||||
 | 
			
		||||
	if (WIFEXITED(status1) && WIFEXITED(status2)) {
 | 
			
		||||
		printf("Goodbye.\n");
 | 
			
		||||
		return EXIT_SUCCESS;
 | 
			
		||||
	}
 | 
			
		||||
	fprintf(stderr, "At least one child died abnormally.\n");
 | 
			
		||||
	return EXIT_FAILURE;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue