#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
int main() {
system(“clear”);
int socks[2];
if (socketpair(AF_UNIX, SOCK_STREAM, 0, socks) == -1) {
perror(“opening socket pair”);
exit(1);
}
Int child
If ((child = fork()) == -1) {
perror(“forking process”);
exit(-1);
}
int state, sock;
char *pname;
if (child) {
state = 0;
pname = “parent”;
sock = socks[0];
} else {
state = 1;
pname = “child”;
sock = socks[1];
}
char msg[15]; int i = 0, o = 0;
while (i < 5 || o < 5) {
if (!state) {
sprint(msg, “message no. %d”, o);
send(sock, msg, strlen(msg) + 1, 0);
++o;
} else {
recv(sock, msg, 15, 0);
printf(“%s: message received: \”%s\”\n”, pname, msg);
++i;
}
state = state ? 0 : 1;
}
return 0;
}
freebsd, перенаправление вывода
Прога тривиальная - один процесс порождает другой и оба они строго поочередно пишут в stdout по строке за раз. При запуске в лоб из shell вывод на экран идет именно таким образом: родитель, потомок, родитель, потомок, .... При перенаправлении вывода "./1 | pipe" или "./1 > ./out" сначала выводит всё-всё-всё родитель, затем потомок. Причем при многократном запуске можно заметить, что отбалды случается, что иногда потомок раньше своё всё-всё-всё выводит, чем предок, хотя это вопреки логике программы. Попробовал разные шеллы — один результат.
То что все скопом выводится наводит на мысль о каких-то хитрых блокировках. А то, что потомок иногда раньше выводит, на мысль о хитрой буферизацией. Ну, может, не хитрой, а просто мне неизвестной. =)ъ
Код:
Хых. А я уже взялся исходники csh изучать. Спасибо, интересная ссылка. С fflush() ведет себя как ожидалось, или почти как ожидалось. Нашел себе кучу презентаций и доков про трубы и т. п., буду разбираться. А то с виду все просто, а на деле вот такие нюансы вылезают. =)